Tengo que hacer una función que enumera todas las subcarpetas en una carpeta. Tengo un filtro sin archivo, pero la función usa scandir() para listar. Eso hace que la aplicación sea muy lenta. ¿Hay una alternativa de scandir(), incluso una función php no nativa? ¡Gracias de antemano!PHP: scandir() es demasiado lento
Respuesta
Puede utilizar readdir que puede ser más rápido, algo como esto:
function readDirectory($Directory,$Recursive = true)
{
if(is_dir($Directory) === false)
{
return false;
}
try
{
$Resource = opendir($Directory);
$Found = array();
while(false !== ($Item = readdir($Resource)))
{
if($Item == "." || $Item == "..")
{
continue;
}
if($Recursive === true && is_dir($Item))
{
$Found[] = readDirectory($Directory . $Item);
}else
{
$Found[] = $Directory . $Item;
}
}
}catch(Exception $e)
{
return false;
}
return $Found;
}
puede requerir algunos tweeking pero esto es esencialmente lo scandir hace, y que debería ser más rápido, si no se puede escribir una actualización como yo Me gustaría ver si puedo hacer una solución más rápida.
Otro problema es que si está leyendo un directorio muy grande, puede llenar su matriz dentro de la memoria interna y es posible que su memoria esté funcionando.
¡Podría intentar y crear una función que lea en desplazamientos para que pueda devolver 50 archivos a la vez!
lectura de trozos de archivos a la vez sería igual de fácil de usar, sería así:
$offset = 0;
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset)))
{
//Use $batch here which contains 50 or less files!
//Increment the offset:
$offset += 50;
}
todo parece perfecto, pero cómo deshabilitarlo. y ... carpetas. También tengo un índice vacío, que no quiero enumerar. Supongo que está en la trampa (Excepción), pero ¿cómo formatearlo? –
He actualizado para que no contenga '.' o' ..' pero no estoy seguro de lo que quiere decir con respecto al índice vacío – RobertPitt
¡¡¡SÍ !!!! Funciona perfectamente para mí. ¡Gracias chicos! –
No escriba el suyo propio. PHP tiene un directorio recursivo iterador específicamente para esto:
http://php.net/manual/en/class.recursivedirectoryiterator.php
Como regla de oro (alias no es 100% de las veces), ya que está implementado en C recta, nada se construye en PHP se va a ser más lento
- 1. Consultas SQL: ¿qué tan lento es demasiado lento?
- 2. Usar git sobre sshfs es demasiado lento
- 3. DivideByZeroException demasiado lento
- 4. f # compilando demasiado lento
- 5. openssl_random_pseudo_bytes() es lento (PHP)
- 6. glReadPixels demasiado lento para usar
- 7. Postgresql Spatial Query demasiado lento
- 8. Python, multihilo demasiado lento, multiproceso
- 9. Drupal 7 es demasiado lento en "primera carga"
- 10. ANDROID - procesamiento dx demasiado lento
- 11. memoria php cuánto es demasiado
- 12. php scandir -> búsqueda de archivos/directorios
- 13. Dispositivo virtual Android super lento - ¿PC demasiado lento?
- 14. El fadein 'lento' de Jquery es demasiado rápido
- 15. C++ cadena de flujo es demasiado lento, ¿cómo acelerar?
- 16. consulta MySQL con combinación izquierda es demasiado lento
- 17. UIImagePickerController'sFinishPickingMediaWithInfo es demasiado lento, ¿puedo agregar progressHUD/indicator?
- 18. SqlDataAdapter.Fill es demasiado lento, incluso para un registro
- 19. Formato de cadena de Python demasiado lento
- 20. jQuery: $ (document) .ready() demasiado lento en IE
- 21. Código Postgresql libpq simple demasiado lento?
- 22. readdir vs scandir
- 23. ¿FILTER_VALIDATE_URL es demasiado estricto?
- 24. scandir() para encontrar las carpetas en un directorio (PHP)
- 25. ¿Cómo obtener solo imágenes usando scandir en PHP?
- 26. readdir y scandir
- 27. STS Spring con Roo and Maven: ¿demasiado lento?
- 28. IndexOf demasiado lento en la lista. Una solución más rápida?
- 29. C#, Lista <T> .Contains() - ¿demasiado lento?
- 30. Usando demasiado include() en php
¿Cuántos archivos/directorios hay en el directorio que está escaneando? No debería ser TAN lento, a menos que estés haciendo un 'stat()' en cada directorio a medida que aparece, o hay miles de archivos allí. –
http://www.php.net/manual/en/function.scandir.php#96326 – Detect
http://www.php.net/manual/en/function.scandir.php#73062 – Detect