2011-11-30 6 views
27

は、私はここで、いくつかのパフォーマンスに関する記事や のreaddir出くわしたPHPスクリプトです:これは正しくファイル/フォルダをエコーPHP再帰的なフォルダのreaddir

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("."); 

。その後、私は最初のコードのような配列を作成することができ、すべてのフォルダやファイルを見つける

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

は今、私はこれを見つけました。

私はsystem('find');readdirよりも速いと思っていますが、それが良い習慣であるかどうかを知りたいですか? ありがとうございました

+8

システムコールは移植性がありません。あなたのサンプルコードは、* nix OSに依存しています。 – nickb

+0

私はcentos 5にapacheとphp + mysqlを持っています。これは大丈夫ですか? – rcs20

+1

'system()'の呼び出しに慣れるのも悪い考えです。パラメータなしでうまくいくはずですが、ユーザの入力に基づいて動的に構築すると、セキュリティホールが悪化する可能性があります。 – millimoose

答えて

35

は、ここに私のサーバー上の10の繰り返しでループするための単純なを使用して、私のベンチマークです:

$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 
    } 
} 

明らかにreaddirのは、あなたのサイトに大量のトラフィックを持っている場合は、特別に使用する方が速いです。

+8

ベンチマークより優れたものは何もありません! nice job – joel

+2

良い答えですが、私は何かが欠けています...それ自身の 'readdir()'解は再帰的ではありません。これは結果を歪ませないでしょうか? –

+0

あなたのような個々の機能をベンチマークする方法は? – kolja

2

'find'は移植性がありません。これはunix/linuxコマンドです。 readdir()は移植性があり、Windowsやその他のOS上で動作します。さらに、パラメータを持たない 'find'は再帰的です。したがって、たくさんのサブディレクトリとファイルを持つディレクトリにいる場合、その$パスの内容だけでなく、すべてを見ることができます。

+0

あなたの関数も再帰的であることがわかりますが、再帰についての暴言を無視してください。ただし、 'find'の出力も特有の方法でフォーマットされています。 – favoretti

+0

私はWindowsを使ったことがないので、UNIXやLinuxだけです。フォーマットするためには、 – rcs20

+2

を扱うことができます。このようにしましょう。速度を考慮すると、それほど問題にはなりませんが、findを使って関数の振る舞いを制御するには、関数の振る舞いを制御するコード方法を使うのではなく、コマンドラインのパラメータを見つける必要があります。非常に具体的な理由がない限り、私は1つは見つけていないだろう。 – favoretti