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 个新文件)。

我尝试过的事情

如果有人知道这里发生了什么,我将 muuuch 感激不尽。

经过一周的编写测试并通过 file_put_contents() 的简单调用重现此问题后,我找到了此问题的根源。做好准备... Spotlight 正在为这些文件编制索引。从 Spotlight 中排除,删除缓存文件,重新启动,没问题。