2010-01-07 78 views
4

我想刪除目錄中的緩存文件,該目錄最多可以包含50.000個文件。我目前使用這個功能。PHP,從目錄搜索和刪除文件 - 性能

// Deletes all files in $type directory that start with $start 

    function clearCache($type,$start) 
     { 
     $open = opendir($GLOBALS['DOC_ROOT']."/cache/".$type."/"); 
     while(($file = readdir($open)) !== false) 
      { 
      if (strpos($file, $start)!==false) 
       { 
       unlink($GLOBALS['DOC_ROOT']."/cache/".$type."/".$file); 
       } 
      } 
     closedir($open);   
     } 

這工作正常,它是快速的,但有沒有更快的方式來做到這一點? (scan_dir似乎很慢)。我可以將緩存顯然移到內存中。

感謝, 村莊

回答

4

你可能想看看進入glob功能,因爲它可能更快......這取決於C庫的水珠命令來完成工作。

我沒有測試過這一點,但我認爲這會工作::

foreach (glob($GLOBALS['DOC_ROOT']."/cache/".$type."/".$start) as $file) { 
    unlink($GLOBALS['DOC_ROOT']."/cache/".$type."/".$file); 
} 

編輯:我不知道,如果$文件將只是文件名或完整路徑。 glob的文檔意味着文件名。

+0

看起來不錯,首先測試顯示這至少是速度的兩倍。非常感謝! – hamlet 2010-01-07 15:52:13

+0

我沒有使用你的解決方案,但'glob'函數導致我使用'RecursiveDirectoryIterator'的另一個解決方案。謝謝。 – dchayka 2017-05-10 15:37:21

0

如前面所建議的glob或者如果您可以確定不會有惡意輸入,那麼應該通過exec(sprintf('rm %s/sess*', realpath($path)));直接發送到系統,這應該是最快的。