Necesito comprobar si un archivo está en HDD en una ubicación especificada ($ path. $ File_name).is_file o file_exists en PHP
¿Cuál es la diferencia entre las funciones is_file()
y file_exists()
y cuál es mejor/más rápida de usar en PHP?
Necesito comprobar si un archivo está en HDD en una ubicación especificada ($ path. $ File_name).is_file o file_exists en PHP
¿Cuál es la diferencia entre las funciones is_file()
y file_exists()
y cuál es mejor/más rápida de usar en PHP?
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()
.
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:
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
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.
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
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
Extraño, ahora parece que 'file_exists' es más rápido que 'is_file'. – weynhamz
por lo que sé, if_file también falla en los enlaces simbólicos, no solo en los directorios. – stefs
Simplemente ejecuté una prueba rápida, y de hecho resuelve el enlace simbólico. – hbw