2011-11-30 14 views
27

me encontré con algunos artículos sobre el rendimiento y readdir aquí es el script php:php recurrente de la carpeta readdir vs rendimiento hallazgo

function getDirectory($path = '.', $level = 0) { 
    $ignore = array('cgi-bin', '.', '..'); 
    $dh = @opendir($path); 
    while(false !== ($file = readdir($dh))){ 
     if(!in_array($file, $ignore)){ 
      $spaces = str_repeat(' ', ($level * 4)); 
      if(is_dir("$path/$file")){ 
       echo "$spaces $file\n"; 
       getDirectory("$path/$file", ($level+1)); 
      } else { 
       echo "$spaces $file\n"; 
      } 
     } 
    } 
    closedir($dh); 
} 
getDirectory("."); 

este eco los archivos/carpetas correctamente.

ahora encontré esto:

$t = system('find'); 
print_r($t); 

que también encontrar todas las carpetas y archivos entonces puedo crear una matriz como el primer código.

Creo que el system('find'); es más rápido que el readdir pero quiero saber si es una buena práctica? muchas gracias

+8

Una llamada al sistema ciertamente no es portátil. Su código de ejemplo depende de un sistema operativo * nix. – nickb

+0

tengo centos 5 con apache y php + mysql que está bien? – rcs20

+1

También es una mala idea acostumbrarse a usar las llamadas 'system()'. Deberían estar bien sin parámetros, pero si los construyes de forma dinámica en función de la entrada del usuario, es probable que se creen malos agujeros de seguridad. – millimoose

Respuesta

35

Aquí es mi punto de referencia usando un simple bucle for con 10 iteraciones en mi servidor:

$path = '/home/clad/benchmark/'; 
// this folder has 10 main directories and each folder as 220 files in each from 1kn to 1mb 

// glob no_sort = 0.004 seconds but NO recursion 
$files = glob($path . '/*', GLOB_NOSORT); 

// 1.8 seconds - not recommended 
exec('find ' . $path, $t); 
unset($t); 

// 0.003 seconds 
if ($handle = opendir('.')) { 
while (false !== ($file = readdir($handle))) { 
    if ($file != "." && $file != "..") { 
    // action 
    } 
} 
closedir($handle); 
} 

// 1.1 seconds to execute 
$path = realpath($path); 
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 
    foreach($objects as $name => $object) { 
    // action 
    } 
} 

Es evidente que el readdir es más rápido de usar especialmente si usted tiene un montón de tráfico en su sitio.

+8

¡nada mejor que un punto de referencia! buen trabajo – joel

+2

Buena respuesta, pero me falta algo ... la solución 'readdir()' por sí sola no es recursiva. ¿Esto no sesgará los resultados? –

+0

¿Cómo comparar las funciones individuales como usted, aki? – kolja

2

'buscar' no es portátil, es un comando unix/linux. readdir() es portátil y funcionará en Windows o cualquier otro sistema operativo. Además, 'encontrar' sin ningún parámetro es recursivo, por lo que si estás en un directorio con muchos subdirectores y archivos, podrás verlos todos, en lugar de solo los contenidos de esa $ ruta.

+0

Aunque veo que tu función también es recursiva, así que ignora la diatriba sobre la recursividad. Sin embargo, tenga en cuenta que la salida de 'buscar' también se formatea de una manera peculiar. – favoretti

+0

Nunca utilicé Windows, así que es unix o linux solamente, para el formateo puedo tratar con – rcs20

+2

Bueno, pongámoslo de esta manera. En lo que respecta a la velocidad, no importará mucho, pero para controlar el comportamiento de la función utilizando el descubrimiento, necesitará modificar los parámetros de la línea de comandos 'encontrar', en lugar de utilizar el modo código para controlar el funcionamiento de la función. Yo, por mi parte, no iría con el hallazgo, a menos que haya una razón muy específica para hacerlo. – favoretti