file_put_contents() 影响目录中其他文件的 fileatime()
file_put_contents() effecting fileatime() of other files in directory
我遇到了一个非常奇怪的错误,过去几天我一直试图解决但没有成功。我有 a class for caching API calls,还有一个 class 在 WordPress 插件中用于创建自定义 API 端点。简而言之,WordPress 插件命中外部 API 并使用我的缓存 class 缓存结果。使用 api 访问许多单独的项目,从而产生几十个本地缓存文件。
场景
在我的缓存 class 中,如果本地缓存已过期(它早于实例化时设置的过期时间),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 实际上 涉及这些文件中的每一个(我已经看到 12 18 个新文件)。
我尝试过的事情
clearstatcache()
调用绝对 _everywhere)
- 手动执行所有
fopen()
、fwrite()
、fflush()
、fclose()
步骤
- 正在写入在
file_put_contents()
调用时写入的文件名
如果有人知道这里发生了什么,我将 muuuch 感激不尽。
经过一周的编写测试并通过 file_put_contents()
的简单调用重现此问题后,我找到了此问题的根源。做好准备... Spotlight 正在为这些文件编制索引。从 Spotlight 中排除,删除缓存文件,重新启动,没问题。
我遇到了一个非常奇怪的错误,过去几天我一直试图解决但没有成功。我有 a class for caching API calls,还有一个 class 在 WordPress 插件中用于创建自定义 API 端点。简而言之,WordPress 插件命中外部 API 并使用我的缓存 class 缓存结果。使用 api 访问许多单独的项目,从而产生几十个本地缓存文件。
场景
在我的缓存 class 中,如果本地缓存已过期(它早于实例化时设置的过期时间),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 实际上 涉及这些文件中的每一个(我已经看到 12 18 个新文件)。
我尝试过的事情
clearstatcache()
调用绝对 _everywhere)- 手动执行所有
fopen()
、fwrite()
、fflush()
、fclose()
步骤 - 正在写入在
file_put_contents()
调用时写入的文件名
如果有人知道这里发生了什么,我将 muuuch 感激不尽。
经过一周的编写测试并通过 file_put_contents()
的简单调用重现此问题后,我找到了此问题的根源。做好准备... Spotlight 正在为这些文件编制索引。从 Spotlight 中排除,删除缓存文件,重新启动,没问题。