2

我制作了程序来偶尔扫描目录,然后删除旧的缓存文件。

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

glob(cacheme_directory()."*");

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

这与限制全局目录/文件夹列表的结果数量不同

我需要减少使用的内存量。因此加载整个东西然后删除东西是行不通的。

这是完整的程序

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);
        }
    }
}
4

4 回答 4

4

用DirectoryIterator ( PHP >= 5 )试试:

$i = new DirectoryIterator( cacheme_directory() );
foreach ($i as $val) {
    if ($val->isFile()) {
        echo "{$val->getFilename()} ({$val->getMTime()})\n";
    }
}
于 2013-01-18T18:28:38.957 回答
3

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

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

于 2013-01-18T18:24:02.110 回答
2

你不能用 glob 做到这一点。但是,您可以使用一些通配符技巧。像

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

如果文件的名称仅以数字开头,这将返回大约十分之一的文件。如果它们只包含字母字符,您可以使用它a*来获取文件名的二十六分之一。

你可以循环播放。

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

或者

for($i=ord('a');$i<=ord('z');$i++){
    glob(cacheme_directory().chr($i)."*");
}
于 2013-01-18T18:22:10.873 回答
1

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

使用 PHP 循环遍历目录的另一种方法是简单地发出 shell 命令,例如:

find /path/to/cache/dir/ -type f -delete

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

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

这假设您可以访问shell()orshell_exec()命令,但不需要大量内存,并且可以通过&在命令末尾添加操作员来进行后台处理。

于 2013-01-18T18:33:13.547 回答