is_file o file_exists en PHP

117

Necesito verificar si un archivo está en el disco duro en una ubicación específica ($ ruta. $ Nombre_archivo).

¿Cuál es la diferencia entre is_file()y file_exists()funciones y que es mejor / más rápido para su uso en PHP?

Duncan Benoit
fuente

Respuestas:

167

is_file()volverá falsesi la ruta indicada apunta a un directorio. file_exists()volverá truesi la ruta indicada apunta a un archivo o directorio válido . Entonces dependería completamente de tus necesidades. Si desea saber específicamente si es un archivo o no, use is_file(). De lo contrario, utilice file_exists().

hbw
fuente
1
Hasta donde yo sé, if_file también falla para los enlaces simbólicos, no solo para los directorios.
stefs
is_file () devuelve verdadero si el archivo existe en el directorio o falso si el archivo no existe cuando
verifico
37

is_file()es el más rápido, pero el índice de referencia reciente muestra que file_exists()es un poco más rápido para mí. Entonces supongo que depende del servidor.

Mi punto de referencia de prueba:

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";
}

Editar: @Tivie gracias por el comentario. Se cambió el número de ciclos de 1000 a 10k. El resultado es:

  1. cuando el archivo existe :

    is_file x 10000 1.5651218891144 segundos

    file_exists x 10000 1.5016479492188 segundos

    is_readable x 10000 3,7882499694824 segundos

  2. cuando el archivo no existe :

    is_file x 10000 0.23920488357544 segundos

    file_exists x 10000 0.22103786468506 segundos

    is_readable x 10000 0,21929788589478 segundos

Editar: movió clearstatcache (); dentro del bucle. Gracias CJ Dennis.

Lamy
fuente
7
para que este punto de referencia funcione, debe agregar clearstatcache (); ya que los resultados de is_file y file_exists se almacenan en caché en todo el script. De todos modos, file_exists () es un poco más lento, pero no debería hacer ninguna diferencia a menos que realice verificaciones de archivos alrededor de 100K. php.net/manual/en/function.clearstatcache.php
Tivie
1
Yo también he encontrado is_file()más rápido que file_exists(). Si sabe que es un archivo (y no un directorio), definitivamente utilícelo en su lugar.
Jonathan
1
Extraño, ahora parece que 'file_exists' es más rápido que 'is_file'.
Weynhamz
7
¿Por qué a las personas les interesa cuál es más rápido, porque estas dos funciones tienen comportamientos diferentes (como se menciona en la respuesta aceptada, la única prueba si es un archivo o un enlace simbólico que apunta a un archivo (pero no un directorio y no un enlace simbólico que apunta a un directorio) y las otras pruebas si es un archivo (que también podría ser un directorio).
Brandin
2
@Brandin La gente está interesada porque en muchas situaciones ya sabes si estás buscando un archivo o directorio, así que si existe es lo único importante. Entonces, si is_dir()resulta ser un 20% más rápido que file_exists()(lo cual no es así, por cierto), puede ser una diferencia importante si solo está buscando directorios de todos modos ...
Byson
1

Ninguno.

is_file () puede devolver verdadero si el archivo no existe.

file_exists () puede devolver verdadero si el archivo es un directorio.

Entonces, si necesita ser un archivo y debe existir, entonces necesita ambos.

La velocidad no importa aquí porque no son lo mismo. Use solo una si solo una función importa y será más rápida.

Puntilla
fuente
1

Sé que esta publicación es antigua, pero la diferencia entre estas funciones no es solo su comportamiento. Si usa is_file () para verificar la existencia de un archivo grande, más de 2 Go. Te sorprenderás. El archivo no existe. :( Pero si verifica con file_exists (), eso funciona.

Juan - 6510866
fuente
0

is_filesería más rápido si lo uso con barra invertida: \is_file. En este caso, PHP proporcionará optimización opcache y tampoco lo file_existshará.

SpinyMan
fuente