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

时间:2013-01-18 18:20:21

标签: php glob

我让程序进行ocassionally扫描目录,然后删除旧的缓存文件。

缓存文件的数量通常很大,而且我的内存错误。

glob(cacheme_directory()."*");

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

这与Limit number of results for glob directory/folder listing

不同

我需要减少使用的内存量。因此加载整个东西然后删除东西将无法正常工作。

这是完整的程序

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 个答案:

答案 0 :(得分:4)

尝试使用DirectoryIterator PHP> = 5 ):

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

答案 1 :(得分:3)

Glob会返回整个目录的数组,你无法改变它。

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

答案 2 :(得分: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)."*");
}

答案 3 :(得分:1)

像@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()命令,但不需要大量内存,并且可以通过在&运算符结尾处进行后台处理。命令。