我让程序进行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);
}
}
}
答案 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)
使用PHP循环遍历目录的另一种方法是简单地发出一个shell命令,如:
find /path/to/cache/dir/ -type f -delete
将删除给定目录中的所有文件。或者您可以匹配某些名称,如:
find /path/to/cache/dir/ -type f -name 'cache*' -delete
这假设您可以访问shell()
或shell_exec()
命令,但不需要大量内存,并且可以通过在&
运算符结尾处进行后台处理。命令。