2009-04-27 15 views

Respuesta

132

is_file() devolverá false si la ruta de acceso indicada apunta a un directorio. file_exists() devolverá true si la ruta dada apunta a un archivo válido o directorio. Entonces dependerá completamente de tus necesidades. Si quiere saber específicamente si es un archivo o no, use is_file(). De lo contrario, use file_exists().

+1

por lo que sé, if_file también falla en los enlaces simbólicos, no solo en los directorios. – stefs

+36

Simplemente ejecuté una prueba rápida, y de hecho resuelve el enlace simbólico. – hbw

30

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í. Así que 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. Cambió el número de ciclos de 1000 a 10k. El resultado es:

  1. cuando existe el archivo :

    is_file x 10000 1,5651218891144 segundo

    file_exists x 10000 1.5016479492188 segundos

    is_readable x 10000 3.7882499694824 segundos

  2. cuando el archivo no existe:

    is_file x 10000 ,23920488357544 segundo

    file_exists x 10000 ,22103786468506 segundo

    is_readable x 10000 ,21929788589478 segundo

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

+5

para que este benchmark 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 comprobaciones de archivos de aproximadamente 100K. http://www.php.net/manual/en/function.clearstatcache.php – Tivie

+1

Yo también he encontrado 'is_file()' más rápido que 'file_exists()'. Si sabes que es un archivo (y no un directorio), definitivamente úsalo. – Jonathan

+1

Extraño, ahora parece que 'file_exists' es más rápido que 'is_file'. – weynhamz