我遇到了一个非常奇怪的错误,过去几天我一直试图解决这个问题,但没有成功。我有a class for caching API calls,以及WordPress插件中用于创建自定义API端点的类。在一个nutshull中,WordPress插件访问外部API并使用我的缓存类缓存结果。使用api访问许多单独的项目,导致几十个本地缓存文件。
在我的缓存类中,如果本地缓存已过期(它比实例化时设置的过期时间早),API会再次被命中,结果会被缓存:
file_put_contents($this->cache, $this->data, LOCK_EX);
在我的WordPress插件中,我想遍历缓存文件并删除任何N天未访问的文件。这个方法使用cron命中。我正在检查访问时间(这仍在开发中,打印用于调试):
print($file . ': ' . date('F jS Y - g:i:s A', fileatime(UPLOADS_DIR . '/' . $file)));
到目前为止,这是完整的方法:
public static function cleanup_old_caches($days = 30) {
// Get the files
$files = scandir(UPLOADS_DIR);
// Save out .txt files
$cache_files = array();
// Loop through everything
foreach ( $files as $file ) {
if ( strstr($file, '.txt') ) {
$cache_files[] = $file;
}
}
// Loop through the cache files
foreach ( $cache_files as $file ) {
clearstatcache();
print($file . ': ' . date('F jS Y - g:i:s A', fileatime(UPLOADS_DIR . '/' . $file)));
echo "\n";
clearstatcache();
}
return '';
}
你会注意到我现在有几个clearstatcache()
电话。
每次创建新的缓存文件时,fileatime()
为同一目录中的许多其他文件报告的访问时间将更新为当前时间。这些有时会在新缓存文件之后再说一秒。
这是我的完整方法:
private function hit_api() {
// Set the return from the API as the data to use
$this->data = $this->curl_get_contents($this->api_url);
// Store the API's data for next time
file_put_contents($this->cache, $this->data, LOCK_EX);
}
我可以找到另一种编写清理逻辑的方法,但我担心PHP 实际触及这些文件(我已经看到18个中的12个用于一个新文件)。
clearstatcache()
绝对调用_everywhere)fopen()
,fwrite()
,fflush()
,fclose()
步骤file_put_contents()
调用如果有人知道这里发生了什么,我将 muuuch 感激。