Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除目录中数以百万计的文件,而不一次列出所有文件_Php_File - Fatal编程技术网

Php 删除目录中数以百万计的文件,而不一次列出所有文件

Php 删除目录中数以百万计的文件,而不一次列出所有文件,php,file,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(

我们在过时的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个文件->4gb内存限制异常)


有没有办法一个接一个地删除这些文件(最好是通过一些日期创建检查)。。如果不一次全部加载它们?

IMHO最好的使用方法也是可用的,但是它的文档记录非常差,所以我坚持使用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());
    }
}
要清除目录
路径
调用

clearDirectory(PATH);
如果要在末尾删除根目录,请使用第二个参数

clearDirectory(PATH, true);
小心使用,这实际上会删除文件


为什么不打开一个shell并
rm-rf
该目录?而不是使用scandir(),它将整个目录列表加载到一个PHP数组中(因此消耗内存),并在内存中单独处理每个条目,或者仍然在PHP
exec('rm-rf')
中处理,如果您需要在删除之前执行一些检查,您可以使用
DirectoryIterator
RecursiveDirectoryIterator
。对于与日期相关的检查,请使用文件系统函数或每个文件的文件信息进行测试,这是我见过的最惊人的昵称/化身。尊敬的先生。。。姆莱科(rofl)