IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Bug PHP dans rmdir() sur un lien symbolique ?


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Bug PHP dans rmdir() sur un lien symbolique ?
    Bonjour à tous.

    Pour la petite histoire, j'ai fait une fonction, ce qu'il y a de plus classique, de suppression recursive de dossier, à savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public function recursiveRemoveDir($dir)
    {
    	$dir = realpath($dir);
    	if(is_dir($dir))
    	{			
    		$scan = scandir($dir);
    		$files = array_diff($scan, array('.','..'));
     
    		foreach ($files as $file) {
    			if(is_dir("$dir/$file")){
    				$this->recursiveRemoveDir("$dir/$file");
    			}
    			elseif(file_exists("$dir/$file")) {
    				unlink("$dir/$file");
    			}
    		}
    		rmdir($dir);
    	}
    }
    Pour une utilisation normale tout fonctionne très bien. Par contre, pour une raison inconnu, cela plante de temps en temps (1 fois sur 20 environ) lorsque le dossier est pointé via un lien symbolique (testé avec un lien symbolique windows (mklink /D, ici C:\www\temp)):

    Une fois arrivé au bout de la fonction, il refuse de supprimer le dossier courant (via rmdir, ligne 18), car il n'est, soit disant, pas vide.

    Alors, là déjà WTF !??


    Du coup, pour tester j'ai essayé d'être un peu bourrin et de rajouter une partie de vérification à la fin de la fonction, qui ré-executerai la boucle de suppression dans le cas ou le dossier serrait concidéré comme non-vide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    public function recursiveRemoveDir($dir, $tries=3)
    {
     
    	if($tries > 0){
    		$dir = realpath($dir);
    		if(is_dir($dir))
    		{
    			$scan = scandir($dir);
    			$files = array_diff($scan, array('.','..'));
     
    			foreach ($files as $file) {
    				if(is_dir("$dir/$file")){
    					$this->recursiveRemoveDir("$dir/$file");
    				}
    				elseif(file_exists("$dir/$file")) {
    					unlink("$dir/$file");
    				}
    			}
     
     
    			/* PARTIE VERIFICATION */
     
    			$scan = scandir($dir);
    			$test = array_diff($scan, array('.','..'));
    			if(count($test)==0) {
    				rmdir($dir);
    			}
    			else {
    				var_dump("dafuk"); echo "<br/>";
    				var_dump($dir); echo "<br/>";
    				var_dump($test); echo "<br/>";
     
    				$this->recursiveRemoveDir($dir, $tries-1);
    			}
    			return;
     
    			/* FIN DE VERIFICATION */
    		}
    	}
    	else
    	{
    		/* THROW EXCEPTION SI TOUTEFOIS LA VERIFICATION N'AURAIT PAS FONCTIONNEE */
     
    		try {
                            //dernière tentative désespérée de suppression
    			rmdir($dir);
    		} catch(FileException $e) {
    			echo $e->getMessage();
    		}
    		return;
    	}
    }
    Malgrès cela, de temps à autre, j'ai tout de même une erreur :
    (correspondant aux var_dump de ma fonction, et du try()catch() final)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    string(5) "dafuk"
    string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc"
    array(1) { [2]=> string(12) "twentytwelve" }
     
    string(5) "dafuk"
    string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc"
    array(1) { [2]=> string(12) "twentytwelve" }
     
    string(5) "dafuk"
    string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc"
    array(1) { [2]=> string(12) "twentytwelve" }
     
    Warning: rmdir(www\temp\47cv6v2llakg4wkwg4ookoscgc044gc): Directory not empty in C:\www\function\ListDirectoryFiles.php on line 191
    Alors, j'avoue que là... Mise à part un bug général de PHP (un delay entre le "return true" de mkdir et la suppression physique du dossier peut-être ??) Je n'ai aucune idée d'ou cela peut venir, ni comment régler le problème.

    Des pistes ?

    Merci beaucoup.



    PS: Ah! et pour information, le dossier est pourtant bien vide lorsque je vais vérifier dedans après coup, donc en gros le script plante vraiment pour rien

  2. #2
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Re !

    Alors j'ai trouvé un solution temporaire:
    J'ai ajouté un sleep(0.3) dans la partie de vérification (à la place des mes var_dump("dafuk")),
    Du coup ça peut faire jusqu'a 1 seconde de delay pour supprimer le dossier (puisque 3 tries).

    Depuis je spam mes tests unitaires, et tout les dossiers sont bien supprimés.


    Mais bon, comme c'est une solution plutôt dégueulasse, je laisse le post ouvert, au cas ou quelqu'un aurrait une vrai solution viable à la place du bout de scotch que je viens de mettre


    Mais pour moi il s'agit vraiment d'un bug de PHP même, je ne vois pas trop ce que je peux y faire.
    A remonter à la "PHP-Team" à votre avis ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/03/2011, 15h05
  2. Question sur un lien symbolique sur (AIX SUN)
    Par genio dans le forum Unix
    Réponses: 6
    Dernier message: 30/04/2009, 11h30
  3. Include possible ? sur un fichier dans un répertoire en lien symbolique ?
    Par Mawashigeri dans le forum Administration système
    Réponses: 3
    Dernier message: 02/02/2008, 21h05
  4. [Conception] Résultat d'une requête PHP dans un tableau avec lien ?
    Par DjMaC dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/04/2006, 20h37
  5. Précisions sur lien symbolique
    Par SteelBox dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 19/09/2004, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo