2016-12-30 11 views
2

我们有一个sessions文件夹在过时Magento安装, 需要从旧文件手动清理。在一个目录中删除数百万个文件而不一次全部列出它们

这是当前的代码:

private function _rrmdirContent($dir) 
{ 
    $items = array_diff(scandir($dir), array('..', '.')); 
    foreach ($items as $item) { 
     $path = $dir . DIRECTORY_SEPARATOR . $item; 
     is_dir($path) ? $this->_rrmdir($path) : unlink($path); 
    } 
} 

它加载大量的资源,如果文件列表是长(1000 000 000文件 - > 4GB内存的限制除外)

是否有办法逐个删除文件(理想情况下用一些日期创建的检查),..一次不加载全部文件?

+3

为什么不打开一个shell和'rm -rf'那个目录? –

+4

而不是使用scandir(),它将整个目录列表加载到一个PHP数组中(因此消耗内存),使用[opendir()](http://www.php.net/manual/en/function.opendir.php) ,[readdir()](http://www.php.net/manual/en/function.readdir.php)和[closedir()](http://www.php.net/manual/en/function。 closedir.php)在内存中单独处理每个条目 –

+0

或仍然在php'exec('rm -rf')' – 2016-12-30 11:25:25

回答

2

恕我直言,最好的方法是使用DirectoryIteratorRecursiveDirectoryIterator也可用,但它的记录很糟糕,所以我坚持DirectoryIterator。

功能递归删除目录下的所有文件可能看起来像这样

function clearDirectory($path, $rmDir = false) 
{ 
    $iterator = new DirectoryIterator($path); 
    foreach ($iterator as $item) { 
     if ($item->isDot()) { 
      continue; // skip dot dirs 
     } 
     if ($item->isDir()) { 
      clearDirectory($item->getPathname(), true); 
     } else { 
      unlink($item->getPathname()); 
     } 
    } 
    if ($rmDir) { 
     rmdir($iterator->getPathname()); 
    } 
} 

要清除目录PATH呼叫

clearDirectory(PATH); 

如果你想在最后删除根目录下,使用第二个参数

clearDirectory(PATH, true); 

请谨慎使用,这实际上会删除文件

+1

我见过的最惊人的昵称/头像。尊重先生... mleko(rofl) –

相关问题