Base de connaissances:
Effacer un répertoire contenant des millions de fichiers sans tuer les IO du serveur
Publié par , Last modified by sur 18 January 2013 07:43 PM

 

Curieusement le php est plus efficace que le shell pour vider un répertoire plein de millions de fichiers:

<?php
//le repertoire
$dir = '/var/tmp/phpsession.old';


$dh = opendir($dir);
$fc=0;
while ( ($file = readdir($dh)) !== false) {
        echo $dir.'/'.$file." - $fc \n";

        // eventuel filtrage pour etre prudent
        if( substr($file, 0,5) == 'sess_' ){
                unlink($dir.'/'.$file);
        }else{
                echo "skip $file\n";
        }


        // tous les 100 fichiers pause pour ne pas tuer le serveur
        if( is_int($fc/100)){
                echo "--- sleep\n";
                sleep(2);
        }

        $fc++;
}
closedir($dh);
echo "\n## $fc ##\n";
?>

 

si vous etes sous linux et avez moins de contraintes vous pouvez aussi lancer une commande d'effacement sous ionice:

 

ionice -c3 rm -Rf /var/ici/cache

 

ionice -c3 demande a ne laisser la commande travailler qu'avec la plus basse des priorités au niveau disque c'est plus violent que le script php qui pause et qui contrôle le nom du fichier mais aussi plus rapide a mettre en place et peut convenir en cas d'arborescence assez profonde.

 

J'ai testé avec succès les deux méthode sur plusieurs millions de fichiers.

voila !

(0 vote(s))
Utile
Pas utile

Commentaires (0)