6 votes

File_exists() versus in_array() de scandir() -- lequel est plus rapide?

Supposons que nous avons une boucle comme celle-ci :

foreach($entries as $entry){ // supposons que cette boucle s'exécute 1000 fois
   if (file_exists('/some/dir/'.$entry.'.jpg')){
      echo 'le fichier existe';
   }
}

Je suppose que cela doit accéder au disque dur 1000 fois et vérifier si chaque fichier existe.

Et si on faisait plutôt ceci ?

$files = scandir('/some/dir/');
foreach($entries as $entry){ // supposons que cette boucle s'exécute 1000 fois
   if (in_array($entry.'.jpg', $files)){
      echo 'le fichier existe';
   }
}

Question 1 : Si cela accède au disque dur une seule fois, alors je pense que cela devrait être beaucoup plus rapide. Ai-je raison sur ce point ?

Cependant, que se passe-t-il si je dois vérifier les sous-répertoires pour un fichier, comme ceci :

foreach($entries as $entry){ // supposons que cette boucle s'exécute 1000 fois
   if (file_exists('/some/dir/'.$entry['id'].'/'.$entry['name'].'.jpg')){
      echo 'le fichier existe';
   }
}

Question 2 : Si je veux appliquer la technique ci-dessus (fichiers dans un tableau) pour vérifier si les entrées existent, comment puis-je ajouter les sous-répertoires à la liste des fichiers à l'aide de la fonction scandir(), afin de pouvoir comparer l'existence des fichiers en utilisant cette méthode ?

5voto

Ben Carey Points 4663

À mon avis, je crois que la fonction scandir() sera plus rapide car elle ne parcourt le répertoire qu'une seule fois, de plus la fonction file_exists() est connue pour être assez lente.

De plus, vous pourriez utiliser la fonction glob(). Cela listera tous les fichiers dans un répertoire qui correspondent à un motif particulier. Voir ici

Indépendamment de mon avis, vous pouvez exécuter un script simple comme suit pour tester la vitesse :

Je ne suis pas sûr du comportement du script ci-dessus avec le cache, vous devrez peut-être séparer les tests dans des fichiers séparés et les exécuter individuellement

Mise à jour 1

Vous pourriez également implémenter la fonction memory_get_usage() pour retourner la quantité de mémoire actuellement allouée au script PHP. Vous pourriez trouver cela utile. Voir ici pour plus de détails.

Mise à jour 2

Quant à votre deuxième question, il existe plusieurs façons de lister tous les fichiers dans un répertoire, y compris les sous-répertoires. Voir les réponses à cette question :

Scan files in a directory and sub-directory and store their path in array using php

0voto

Vishnu Renku Points 1380

Vous pouvez jeter un coup d'œil ici.

J'ai modifié le "code de la question" de sorte que vous puissiez faire une vérification rapide en,

Personnellement, je pense que scandir() sera plus rapide que in_array().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X