Vider rapidement un répertoire sur serveur

  • Auteur de la discussion Auteur de la discussion OTP
  • Date de début Date de début
WRInaute accro
Bonsoir,

J'utilise une gestion de cache sur mon site.
Le souci est que le site compte plus de 200 000 pages et vider ce cache est très long.

J'utilise actuellement cette méthode :

Code:
function SureRemoveDir($dir)
{
    if(!$dh = @opendir($dir)) return;
	while (($obj = readdir($dh)))
	{
		if($obj=='.' || $obj=='..') continue;
		if (!@unlink($dir.'/'.$obj)) SureRemoveDir($dir.'/'.$obj, true);
	}
}

Mais sur mon mutu ça prend des plombes.

Connaissez-vous un moyen rapide de vider un répertoire bien encombré ?

Merci d'avance,

OTP
 
WRInaute occasionnel
Salut OTP.

Je serais tenté de dire en ligne de commande.

Ton site est sur un serveur linux ? Si oui, ça peut aller très vite avec les bonnes commandes qui vont bien en root ;)
 
WRInaute accro
Suis sur un mutu OVH 300 gp
Donc linux je pense
Quant à balancer du code en direct, je ne sais pas 1/ si j'ai les droits 2/ si j'en suis capable...
 
WRInaute passionné
Hello

Essaye ceci :

Code:
<?php 
 function rrmdir($dir) { 
   if (is_dir($dir)) { 
     $objects = scandir($dir); 
     foreach ($objects as $object) { 
       if ($object != "." && $object != "..") { 
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); 
       } 
     } 
     reset($objects); 
     rmdir($dir); 
   } 
 } 
?>

pioché sur http://www.php.net/manual/fr/function.rmdir.php
A noter que sur cette page, il y a d'autres solutions intéressantes, à tester
 
WRInaute occasionnel
Ok bah comme loran750, je te propose un script en php alors :
Code:
<?php
/**
 * rm() -- Vigorously erase files and directories.
 *
 * @param $fileglob mixed If string, must be a file name (foo.txt), glob pattern (*.txt), or directory name.
 *                        If array, must be an array of file names, glob patterns, or directories.
 */
function rm($fileglob)
{
    if (is_string($fileglob)) {
        if (is_file($fileglob)) {
            return unlink($fileglob);
        } else if (is_dir($fileglob)) {
            $ok = rm("$fileglob/*");
            if (! $ok) {
                return false;
            }
            return rmdir($fileglob);
        } else {
            $matching = glob($fileglob);
            if ($matching === false) {
                trigger_error(sprintf('No files match supplied glob %s', $fileglob), E_USER_WARNING);
                return false;
            }      
            $rcs = array_map('rm', $matching);
            if (in_array(false, $rcs)) {
                return false;
            }
        }      
    } else if (is_array($fileglob)) {
        $rcs = array_map('rm', $fileglob);
        if (in_array(false, $rcs)) {
            return false;
        }
    } else {
        trigger_error('Param #1 must be filename or glob pattern, or array of filenames or glob patterns', E_USER_ERROR);
        return false;
    }

    return true;
}

rm("./ledossierasupprimer");

?>

Sachant que tu peux aussi supprimer un fichier avec ce bout de code ...
 
WRInaute passionné
Si tu veux que les fichiers ne soient plus accessibles rapidement le mieux c'est sûrement de renommer le répertoire.C'est la seule solution valable que j'ai trouvée pour renouveler mon cache.
 
WRInaute occasionnel
loran750 a dit:
@lunicrea : j'adore le "Vigorously erase" :) ça c'est du titre de fonction qui dépote !
héhé, wé c'est ma fonction ERASER ! 8)

ça t'enlève absolument toutes les merdes sur ton ftp. :twisted:
 
WRInaute accro
en plus court (et rapide) :

Code:
deleteAll($_SERVER['DOCUMENT_ROOT'].'/cache/.../');    
function deleteAll($directory) {
	exec("rm -rf $directory");	
}

note en manipulant la commande "rm" (voir man page) tu peux aussi introduire de la récursivité si necessaire.
 
WRInaute accro
PHP:
<span class="syntaxdefault"><br />exec</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"rm -rf $directory"</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> <br /> </span>
Avec ça s'il y a trop de fichiers, rm va mettre une erreur "too many arguments" (limitation du kernel).

Il faut donc passer par find + xargs:
PHP:
<span class="syntaxdefault"><br />exec</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"find&nbsp;$directory&nbsp;|&nbsp;xargs&nbsp;rm"</span><span class="syntaxkeyword">);<br />&nbsp;</span><span class="syntaxdefault"></span>
 
WRInaute accro
Merci pour vos réponses.
Je retiens finalement la méthode du renommage de répertoire.
Ensuite, tant pis si mon script prend son temps, ce n'est plus un problème.
 
WRInaute discret
Salut !

Pourquoi ne pas combiner les deux solutions ?

Par exemple, tu renommes ton répertoire, et les nouveaux caches se placent automatiquement dans le nouveau.

Puis, tu mets en place une tâche cron, qui s'exécute de manière régulière, et vide progressivement le répertoire.

Tu sélectionnes par exemple 500 fichiers, et tu lances la tâche toutes les minutes.

Du coup, aucun dérangement pour tes visiteurs, et ton serveur ne souffre pas :)
 
WRInaute accro
spout a dit:
Avec ça s'il y a trop de fichiers, rm va mettre une erreur "too many arguments" (limitation du kernel).
Si tu obtiens une erreur "too many arguments" c'est qu'a la base le système est mal pensé. Il est préjudiciable pour plein de choses d'avoir trop de fichiers dans un même dossier donc en amont il faut penser a travailler différemment ;-) . Mais dans le principe tu as raison.
 
WRInaute accro
OTP a dit:
J'utilise une gestion de cache sur mon site.
Le souci est que le site compte plus de 200 000 pages et vider ce cache est très long.

j'ai un cas identique au tiens. Pour éviter le souci de l'engorgement du dossier cache, je l'ai décomposé en sous dossiers nommés 0 à 9 puis a à f (réference a l'héxadécimal volontaire), eux mêmes sont re-décomposés a l'identique, le tout sur 4 niveaux (mais cela pourrait être moins).

Un code simple analyse l'url de la page (l'url est un lien direct et unique avec le contenu en cache)

Code:
$ucode = md5($_SERVER['REQUEST_URI']);
$code = substr($ucode,0,4);
$cacheFile = $_SERVER['DOCUMENT_ROOT'].'/cache/sub/'.substr($code,0,1).'/'.substr($code,1,1).'/'.substr($code,2,1).'/'.substr($code,3,1).'/'.$code.'.php';

Dans mon cas le fichier cache est un fichier php qui contiens plusieurs pages (en-capsulées dans des variables du style $content['php'][$ucode] = '<html>...</html>';) et il est nommé $code.'.php', si ton cache contiens que du html et qu'un seul fichier existe pour une page le nom (unique) pour le fichier html pourrait s'écrire $ucode.'.html'.

ce système a 4 niveau donne 65 536 dossier, donc ça laisse beaucoup de place pour y enregistrer beaucoup de fichiers (c'est pour ça que je disais que cela pouvait être moins).

la fonction donnée avant vire facilement ce cache (en quelques secondes chez moi)
 
WRInaute accro
patapon87 a dit:
OTP : j'ai eu le même soucis sous ovh on m'a conseillé de passer par là :
http://cluster014.ovh.net/net2ftp/

Ainsi tu peux demander d'effacer tous les fichiers directement, ça prend un peu de temps aussi ceci dit. Ca marche parfaitement pour moi qui suis à 120 000 fichiers

Merci !!!

Au final cette solution aussi est redoutable
Il me vide mon cache en 1 minute environ, là où je pouvais atteindre la demi-heure avant !
Et en plus c'est directement fourni par OVH !
 
Nouveau WRInaute
Petite question à ce sujet...

:D

Quid des performances d'un répertoire avec des centaines de milliers de fichiers ? J'entends quand on accède simplement aux fichiers individuellement, sans parcourir toute l'arborescence du répertoire ?
 
WRInaute impliqué
... et vous avez une idée de comment supprimer un répertoire qui te hurle "Il est pas vide, je ne peux rien supprimer !!!".

Parce qu'avec mes hébergement, j'ai régulièrement le problème, avec des sous domaine qui n'existe plus, par exemple, dont on ne peu supprimer le dossier "joint".
obliger de passer par le support client qui me répond à chaque fois : "Pas de soucis, on supprimer. Le répertoire possède toujours des 'allocations', dont l'impossibilité pour vous de le supprimer".
Moi, ça me saoule...
 
WRInaute impliqué
OTP a dit:
Des allocations ? C'est quoi ?
allocations, tags, je ne sais plus exactement le terme employé.

Toujours est-il que c'est avec des répertoire qui avait un lien avec "autre chose" (sous-domaine, multidomaine, protection...), mais une fois ce lien supprimé, le répertoire, même vide était impossible à supprimer, voir pour certain impossible à renommer.

Si julia passe par là...
 
Discussions similaires
Haut