我编写了一个程序,偶尔扫描目录,然后删除旧的缓存文件。
通常缓存文件的数量非常大,我遇到内存不足的错误。
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()
命令,但不需要大量内存,并且可以通过在命令末尾添加&
操作符来实现。