删除目录中的数百万个文件,而不是一次性列出所有文件

时间:2016-12-30 11:21:34

标签: php file

我们在过时的 Magento 安装中有一个sessions文件夹, 需要从旧文件中手动清除。

这是当前的代码:

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个文件 - > 4 GB内存限制异常),它会加载大量资源

有没有办法逐个删除文件(最好是创建一些日期检查),..而不是一次性加载它们?

1 个答案:

答案 0 :(得分: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);
  

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