На прошлой неделе я опубликовал довольно простую систему кеша на моем сайте, используя класс PHP, указанный в файле файла sitewide. Система кэширования значительно улучшила время отклика сервера (шаблон извлекает данные с нескольких других серверов в нашем центре обработки данных, поэтому он не все кэшируется в памяти Apache). Проблема в том, что это были файлы с кешированием. Я считаю, что он настроен на кеширование в течение пяти минут или до тех пор, пока HTML не будет изменен, но он все еще обслуживал кешированные версии страниц через несколько дней после создания кешированных версий.PHP Caching Too Long
Может ли кто-нибудь выявить какие-либо проблемы с моим кодом или вы знаете о каких-либо версиях PHP/Apache/Red Hat, которые могут, скажем, сообщать плохую информацию о времени изменения файла? (Мы на PHP 5.3.3, Apache 2.2.15 и RHEL 6. Я был запущен mod_pagespeed, но проблема сохраняется даже после того, как я отключил его.)
<?php
class IWU_Cache {
protected $cache_prefix = '/tmp/webcache_';
protected $remote_delay = 300; // in seconds; 300 is five minutes
protected $path;
public function __construct($path = '') {
$this->path = $path;
}
public function isRecentlyCached() {
$cache_location = $this->path2Cache($this->path);
if(is_file($cache_location)) {
if(is_file($_SERVER['DOCUMENT_ROOT'] . $this->path) && (filemtime($_SERVER['DOCUMENT_ROOT'] . $this->path) < filemtime($cache_location))) {
return TRUE;
}
elseif(filemtime($cache_location) > time() - $this->remote_delay) {
return TRUE;
}
}
return FALSE;
}
public function getCachedVersion() {
return file_get_contents($this->path2Cache($this->path));
}
public function addToCache($html) {
return file_put_contents($this->path2Cache($this->path), $html);
}
protected function path2Cache($path) {
return $this->cache_prefix . str_replace('/', '____', $path);
}
}
?>
Есть ли еще ваш класс кеширования, чем вы разместили? – MrWhite
@ w3d: нет; это оно. – michaelcgorman
Не связанный с вашей проблемой (рад, что вы его отсортировали), но я заметил пару запросов/аномалий с вашим классом ... ** 1. ** Параметр '$ path' в вашем конструкторе объявлен как необязательный, но это не факультативно - ваш класс не будет работать без него, и, похоже, нет другого способа его установить. ** 2. ** Вы всегда передаете '$ this-> path' (защищенное свойство) на' path2cache() '(защищенный метод) - это, казалось бы, не нужно? – MrWhite