2014-09-08 5 views
1

На прошлой неделе я опубликовал довольно простую систему кеша на моем сайте, используя класс 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); 
    } 
} 

?> 
+0

Есть ли еще ваш класс кеширования, чем вы разместили? – MrWhite

+0

@ w3d: нет; это оно. – michaelcgorman

+0

Не связанный с вашей проблемой (рад, что вы его отсортировали), но я заметил пару запросов/аномалий с вашим классом ... ** 1. ** Параметр '$ path' в вашем конструкторе объявлен как необязательный, но это не факультативно - ваш класс не будет работать без него, и, похоже, нет другого способа его установить. ** 2. ** Вы всегда передаете '$ this-> path' (защищенное свойство) на' path2cache() '(защищенный метод) - это, казалось бы, не нужно? – MrWhite

ответ

0

Я предполагаю, что вы звоните isRecentlyCached() в определить, кэшируется ли файл? В этом случае, после того, как файл кэша был записан, то первое условие всегда будет истинным, пока сам файл не будет снова изменен ...

if(is_file($_SERVER['DOCUMENT_ROOT'] . $this->path) && (filemtime($_SERVER['DOCUMENT_ROOT'] . $this->path) < filemtime($cache_location))) { 
    return TRUE; 
} 

Другими словами (псевдо-код):

if (timestamp of actual file < timestamp of cached file) /* TRUE */ 
+1

А, ты прямо. В принципе, мне нужно было И эти два условия, но я эффективно их исходил. Я изменил 'isRecentlyCached()' соответственно: https://gist.github.com/michaelcgorman/41a33cd06ef226dc43ed – michaelcgorman