is_file ou file_exists en PHP

117

Je dois vérifier si un fichier se trouve sur le disque dur à un emplacement spécifié ($ path. $ File_name).

Quelle est la différence entre is_file()et file_exists()fonctions et ce qui est mieux / plus rapide à utiliser en PHP?

Duncan Benoit
la source

Réponses:

167

is_file()retournera falsesi le chemin indiqué pointe vers un répertoire. file_exists()retournera truesi le chemin indiqué pointe vers un fichier ou un répertoire valide . Cela dépendrait donc entièrement de vos besoins. Si vous voulez savoir précisément s'il s'agit d'un fichier ou non, utilisez is_file(). Sinon, utilisez file_exists().

hbw
la source
1
pour autant que je sache, if_file échoue également pour les liens symboliques, pas seulement les répertoires.
stefs
is_file () retourne true si le fichier existe dans le répertoire ou false si le fichier n'existe pas lors de l'enregistrement en 2020 pourrait être la version php le mettre à jour
heySushil
37

is_file()est la référence la plus rapide, mais récente, qui file_exists()est légèrement plus rapide pour moi. Donc je suppose que cela dépend du serveur.

Mon test de référence:

benchmark('is_file');
benchmark('file_exists');
benchmark('is_readable');

function benchmark($funcName) {
    $numCycles = 10000;
    $time_start = microtime(true);
    for ($i = 0; $i < $numCycles; $i++) {
        clearstatcache();
        $funcName('path/to/file.php'); // or 'path/to/file.php' instead of __FILE__
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    echo "$funcName x $numCycles $time seconds <br>\n";
}

Edit: @Tivie merci pour le commentaire. Changement du nombre de cycles de 1000 à 10k. Le résultat est:

  1. lorsque le fichier existe :

    is_file x 10000 1,5651218891144 secondes

    file_exists x 10000 1,5016479492188 secondes

    is_readable x 10000 3,7882499694824 secondes

  2. lorsque le fichier n'existe pas :

    is_file x 10000 0,23920488357544 secondes

    file_exists x 10000 0,22103786468506 secondes

    is_readable x 10000 0,21929788589478 secondes

Edit: déplacé clearstatcache (); à l'intérieur de la boucle. Merci CJ Dennis.

Lamy
la source
7
pour que ce benchmark fonctionne, vous devez ajouter clearstatcache (); puisque les résultats pour is_file et file_exists sont mis en cache tout au long du script. Quoi qu'il en soit, file_exists () est un peu plus lent, mais ne devrait faire aucune différence à moins que vous n'effectuiez environ 100K de vérifications de fichiers. php.net/manual/en/function.clearstatcache.php
Tivie
1
Moi aussi j'ai trouvé is_file()plus vite que file_exists(). Si vous savez que c'est un fichier (et non un répertoire), utilisez-le à la place.
Jonathan
1
Bizarre, maintenant il semble que «file_exists» soit plus rapide que «is_file».
weynhamz
7
Pourquoi les gens s'intéressent-ils à ce qui est le plus rapide, car ces deux fonctions ont des comportements différents (comme mentionné dans la réponse acceptée, celle teste s'il s'agit d'un fichier ou d'un lien symbolique qui pointe vers un fichier (mais pas un répertoire et pas un lien symbolique qui pointe vers un répertoire) et les autres tests s'il s'agit d'un fichier (qui pourrait aussi être un répertoire).
Brandin
2
@Brandin Les gens sont intéressés car dans de nombreuses situations, vous savez déjà si vous recherchez un fichier ou un répertoire, donc s'il existe est la seule chose importante. Donc, s'il is_dir()s'avère être 20% plus rapide que file_exists()(ce qui n'est pas le cas, au fait), cela peut être une différence importante si vous ne vérifiez que les dirs de toute façon ...
Byson
2

Ni.

is_file () peut retourner true si le fichier n'existe pas.

file_exists () peut retourner true si le fichier est un répertoire.

Donc, s'il doit s'agir d'un fichier et qu'il doit exister, vous avez besoin des deux.

La vitesse n'a pas d'importance ici car ce ne sont pas les mêmes. N'utilisez qu'une seule fonction si une seule fonction compte et ce sera plus rapide.

Brad
la source
1

Je sais que cet article est ancien mais la différence entre ces fonctions n'est pas seulement leurs comportements. Si vous utilisez is_file () pour vérifier l'existence d'un gros fichier, plus de 2 Go. Vous serez surpris. Le fichier n'existe pas. :( Mais si vous vérifiez avec file_exists (), cela fonctionne.

Juan - 6510866
la source
0

is_fileserait plus rapide si l' utilisation avec la barre oblique inverse: \is_file. Dans ce cas, PHP fournira une optimisation opcache non file_existsplus.

Homme épineux
la source