Vider rapidement un répertoire sur serveur

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par OTP, 20 Octobre 2011.

  1. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    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
     
  2. lunicrea
    lunicrea WRInaute occasionnel
    Inscrit:
    30 Août 2010
    Messages:
    479
    J'aime reçus:
    1
    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 ;)
     
  3. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    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...
     
  4. loran750
    loran750 WRInaute passionné
    Inscrit:
    15 Mars 2005
    Messages:
    2 017
    J'aime reçus:
    0
    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
     
  5. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Je vais regarder, merci !
     
  6. lunicrea
    lunicrea WRInaute occasionnel
    Inscrit:
    30 Août 2010
    Messages:
    479
    J'aime reçus:
    1
    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 ...
     
  7. loran750
    loran750 WRInaute passionné
    Inscrit:
    15 Mars 2005
    Messages:
    2 017
    J'aime reçus:
    0
    @lunicrea : j'adore le "Vigorously erase" :) ça c'est du titre de fonction qui dépote !
     
  8. forty
    forty WRInaute passionné
    Inscrit:
    30 Octobre 2008
    Messages:
    1 929
    J'aime reçus:
    0
    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.
     
  9. lunicrea
    lunicrea WRInaute occasionnel
    Inscrit:
    30 Août 2010
    Messages:
    479
    J'aime reçus:
    1
    héhé, wé c'est ma fonction ERASER ! 8)

    ça t'enlève absolument toutes les merdes sur ton ftp. :twisted:
     
  10. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 181
    J'aime reçus:
    1
    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.
     
  11. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 176
    J'aime reçus:
    327
    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>
     
  12. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    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.
     
  13. lunicrea
    lunicrea WRInaute occasionnel
    Inscrit:
    30 Août 2010
    Messages:
    479
    J'aime reçus:
    1
    Dammit ! J'ai perdu l'appel d'offres ... :mrgreen:
     
  14. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Je retiens juste le plus simple pour mon cas, pas forcément le meilleur pour un cas standard ! ;)
     
  15. loran750
    loran750 WRInaute passionné
    Inscrit:
    15 Mars 2005
    Messages:
    2 017
    J'aime reçus:
    0
    et les fichiers restants [dans le répertoire renommé] ? Tu les traites plus tard, c'est ça ?
     
  16. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Oui, mais là ce n'est pas grave si ça prend 15 minutes.
     
  17. JulienV
    JulienV WRInaute discret
    Inscrit:
    18 Mars 2010
    Messages:
    164
    J'aime reçus:
    0
    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 :)
     
  18. patapon87
    patapon87 WRInaute passionné
    Inscrit:
    12 Janvier 2010
    Messages:
    1 135
    J'aime reçus:
    0
    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
     
  19. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 181
    J'aime reçus:
    1
    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.
     
  20. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 181
    J'aime reçus:
    1
    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)
     
  21. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    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 !
     
  22. astraction
    astraction Nouveau WRInaute
    Inscrit:
    6 Novembre 2011
    Messages:
    3
    J'aime reçus:
    0
    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 ?
     
  23. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Pas de souci de ce coté sur mon simple mutu OVH
     
  24. Ehplod
    Ehplod WRInaute impliqué
    Inscrit:
    22 Octobre 2011
    Messages:
    615
    J'aime reçus:
    0
    ... 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...
     
  25. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Des allocations ? C'est quoi ?
     
  26. astraction
    astraction Nouveau WRInaute
    Inscrit:
    6 Novembre 2011
    Messages:
    3
    J'aime reçus:
    0
    Bon à savoir, merci !
     
  27. Ehplod
    Ehplod WRInaute impliqué
    Inscrit:
    22 Octobre 2011
    Messages:
    615
    J'aime reçus:
    0
    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à...
     
  28. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Ca doit dépasser le domaine de mes compétences.
    Désolé.
     
Chargement...
Similar Threads - Vider rapidement répertoire Forum Date
serveur sous plesk : fichier error_log de 1.2To ! comment le vider proprement ? Administration d'un site Web 3 Février 2016
Ligne de commande via putty pour vider un dossier ? Administration d'un site Web 5 Juin 2015
Vider le champs quand il est caché Développement d'un site Web ou d'une appli mobile 21 Décembre 2014
Vider le dcachesize dans vituozzo ? Administration d'un site Web 29 Avril 2014
Comment vider une page facebook de son contenu ? Facebook 20 Septembre 2013
Forcer ses visiteurs à vider leur cache ? Développement d'un site Web ou d'une appli mobile 3 Juillet 2013
Besoin de booster mon référencement très rapidement :) Débuter en référencement 19 Avril 2020
Enlever rapidement des milliers url spam (erreur 404) de l'index google Crawl et indexation Google, sitemaps 25 Septembre 2019
Forcer rapidement la mise à jour de la cache de nos pages sur google ? Crawl et indexation Google, sitemaps 19 Mars 2016
faire connaitre mon blog et mon site très très rapidement Débuter en référencement 18 Août 2014