Base de connaissances:
Effacer un répertoire contenant des millions de fichiers sans tuer les IO du serveur
Publié par ghislain adnet, Last modified by ghislain adnet sur 05 avril 2013 03:31 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)