Я столкнулся с действительно странной ошибкой, которую безуспешно пытался устранить последние несколько дней. я имею класс для кэширования вызовов API, и класс, используемый в плагине WordPress для создания пользовательских конечных точек API. Вкратце плагин 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 на самом деле касаясь каждого из этих файлов (я видел 12 из 18 для одного нового файла).
clearstatcache()
звонки абсолютно везде)fopen()
, fwrite()
, fflush()
, fclose()
шаги вручнуюfile_put_contents()
вызовЕсли у кого-то есть идея, что здесь происходит, я буду muuuch признательна.
После недели написания тестов и воссоздания этой проблемы с помощью простого звонка file_put_contents()
Я нашел источник этой проблемы. Будьте готовы к этому … Центр внимания индексирует эти файлы. Исключил из Spotlight, удалил файлы кеша, запустил заново, проблем нет.
Других решений пока нет …