如何限制glob返回的文件数量以节省内存


How to limit the number of files returned by glob to save memory?

我编写了一个程序,偶尔扫描目录,然后删除旧的缓存文件。

通常缓存文件的数量非常大,我遇到内存不足的错误。

glob(cacheme_directory()."*");

如何使glob返回有限数量的文件?说第一个50000。然后我们将删除它们,然后在下一次会话中我们可以再次删除,等等。

这与glob目录/文件夹列表

的限制结果数不同

我需要减少内存使用量。因此,加载整个内容然后删除内容将无法工作。

这是完整的程序

if (mt_rand(0,1000)==0)
{
    $files = glob(cacheme_directory()."*");
    foreach($files as $file)
    {
        $filemtime=filemtime ($file);
        if (is_file($file) && time()-$filemtime>= $cacheAge)
        {
            unlink($file);
        }
    }
}

试试DirectoryIterator (PHP>= 5):

$i = new DirectoryIterator( cacheme_directory() );
foreach ($i as $val) {
    if ($val->isFile()) {
        echo "{$val->getFilename()} ({$val->getMTime()})'n";
    }
}

Glob将返回整个目录的数组,您不能更改。

要将有限数量的文件读入内存,请检查PHP中的opendir函数,该函数允许您在资源上编写自己的循环。

您不能使用glob。然而,你可以使用一些外卡技巧。像

glob(cacheme_directory()."1*");

如果文件名仅以数字开头,则返回大约十分之一的文件。如果它们只包含字母字符,则可以使用a*获取文件名的1/26。

你可以循环。

for($i=0;$i<10;$i++){
    glob(cacheme_directory()."$i*");
}

for($i=ord('a');$i<=ord('z');$i++){
    glob(cacheme_directory().chr($i)."*");
}

就像@Dutow说的:glob将返回整个目录的数组,你不能改变它。

用PHP循环遍历目录的另一种方法是简单地发出一个shell命令,如:
find /path/to/cache/dir/ -type f -delete

将删除给定目录下的所有文件。或者您可以匹配某些名称,如:

find /path/to/cache/dir/ -type f -name 'cache*' -delete

这假设您可以访问shell()shell_exec()命令,但不需要大量内存,并且可以通过在命令末尾添加&操作符来实现。