2011-11-30 34 views
27

我碰到有關性能和READDIR 幾篇文章,這裏是一個PHP腳本:PHP遞歸文件夾READDIR VS發現性能

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

這裏是我的服務器上使用一個簡單的for循環使用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

沒有比基準更好的了!不錯的工作 – joel

+2

很好的答案,但我錯過了什麼......自己的'readdir()'解決方案不是遞歸的。這不會扭曲結果嗎? –

+0

如何基準你的個人功能,aki? – kolja

2

'find'不是可移植的,它是一個unix/linux命令。 readdir()是可移植的,可以在Windows或任何其他操作系統上使用。此外,沒有任何參數的'find'是遞歸的,所以如果你在一個有很多子目錄和文件的目錄中,你將會看到它們全部,而不僅僅是那個$路徑的內容。

+0

雖然我看到你的函數也是遞歸的,所以忽略關於遞歸的咆哮。但請注意,'find'的輸出也以特殊方式格式化。 – favoretti

+0

我從來沒有使用Windows,所以它只是unix或linux,因爲我可以處理 – rcs20

+2

好吧,讓我們這樣說吧。速度方面並不重要,但要使用find來控制函數的行爲 - 您需要調整「find」命令行參數,而不是使用代碼控制函數行爲的方式。舉個例子,我不會去找,除非有一個非常明確的理由去做。 – favoretti