Просмотр полной версии : очистка кеша для определенного урла
Добрый день!
Есть страница, для которой в кеше хранится много записей в зависимости от параметра.
Например, для одной и той же страницы http://site.ru/news/ в кеше будут разные записи для ссылок http://site.ru/news/1/, http://site.ru/news/2/ и т.п.
Таких ссылок могут быть тысячи.
Если чистить кеш для всей страницы, то будут очищены все записи для данной страницы.
Задача такая - надо очистить кеш для заданной записи, а для всех остальных оставить.
Вроде бы можно посчитать hash ссылки, найти соответствующую запись в cache_pages и ее очистить. Но очистки cache_pages недостаточно.
Как лучше сделать описанную задачу? Может есть API или примеры?
Заранее спасибо.
dmartynenko
01.10.2008, 13:39
Полгода назад искал решение этой задачи, спрашивал и в забугорном mail list - решения не нашел. Была мысль проследить путь которым страница кэшируется и сделать алгоритм для обратной операции. Но времени на это не было.
Пошел другим путем. На странице плагин вставлен как USER_INT, а внутри него выдача контента кэшируется в memcached, и очишается соответственно тоже через memcached.
Мне кажется этот путь даже предпочтительней - вместо того, что бы в базе кэшировать 1000 вариантов одной и той же страницы но с разным "центральным" контентом, кэшируется страница один раз - а основной контент кэшируется отдельно. Место это занимает намного меньше, и работает быстрее.
Логика ясна. В моем случае так заморачиваться - сложно, т.к. на страницах несколько USER_INT элементов, причем на разных страницах - разные. Т.е. нет единого "центрального" контента. Хотя, возможно, имеет смысл.
Как определили, что ваш вариант быстрее? Ведь TYPO3 сначала все равно страницу берет из своего кеша. А только потом ваш модуль еще раз генерит свое содержание (кешированное).
Можно ли где-нибудь посмотреть ваш модуль? Все таки интересно.
По моему вопросу еще можно по идее посмотреть коды модуля clearcacheextend. Но поскольку нет уверенности в его правильности, поэтому решил сначала поинтересоваться у сообщества.
dmartynenko
01.10.2008, 15:46
Оценка "быстрее" конечно чисто умозрительная. Так как испробовать 1-й вариант я не могу и соответственно сравнить тоже.
Но мои плюсы таковы:
1. Так как, например, в cache_pages храниться не 1000+ страниц (=1000*50 Кб), а только одна (= 50Кб), то выборка из такой таблицы будет быстрее. И таблица большая и в кэш mysql маловероятно попадет. В целом уменьшение размера cache_pages полезнее для всего сайта.
2. На сервере проц быстрый, поэтому накладные расходы на выполнение USER_INT с учетом php-акселераторов минимальны.
3. Положить/взять из memcached - это всего одна очень быстрая функция php. Ключ делается например путем md5(serialize($this->piVars)). Если надо привызываться к выводу single, то можно использовать $this->extKey.$recordID.'single'. И по этому же ключу чистить кэш при изменении записи в БД.
Модуль закрытый :) - но все это очень даже просто:
...
// соединяемся с Memcache если есть
if (class_exists('Memcache')) {
$this->memcache = new Memcache;
if (! @$this->memcache->connect('localhost', 11211)) {
$this->memcache = null;
}
}
...
function cache_set ($key, &$data, $time = 300, $force_caching = false)
{
if (! $force_caching && intval(t3lib_div::_GP('no_cache'))) return false;
if (! is_object($this->memcache)) return false;
return $this->memcache->set($key, $data, MEMCACHE_COMPRESSED, $time);
}
function cache_get ($key, $force_caching = false)
{
if (! $force_caching && intval(t3lib_div::_GP('no_cache'))) return false;
if (! is_object($this->memcache)) return false;
$data = $this->memcache->get($key);
return $data;
}
В итоге имеем 50Кб в mysql + 1000*(10-20 Кб чистого контента) в memcached (а еще можно включить сжатие gzip в memcached) - вместо 50 Мб в mysql. И все таки cpu+ram быстрее чем cpu+hdd во много-много раз.
Здорово, спасибо.
В принципе как с memcached работать понятно. Но больше интересовало как "перехватить" контент, который генерит TYPO3, чтобы его положить в кеш.
есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?
Для просмотра кеша конкретной страницы в зависимости от параметров пользуюсь плагином cachemgm (там много параметров кеша выводится) - можно попробовать доработать по типу просмотра индексированных страниц - добавить корзиночку для удаления конкретной записи.
dmartynenko
03.10.2008, 16:46
есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?
Как-то мне не понравились они (правда смотрел давно).
Если я правильно уловил смысл их работы - в контент страницы добавляется опредленный блок HTML-комметариев, по которому в дальшейшем делается поиск соответсвующей записи в таблице кэша. Мне кажется это очень медленно.
dmartynenko
03.10.2008, 16:57
Здорово, спасибо.
В принципе как с memcached работать понятно. Но больше интересовало как "перехватить" контент, который генерит TYPO3, чтобы его положить в кеш.
Если кэшировать вставки USER_INT, то в typo3/sysext/cms/tslib/index_ts.php есть блок:
// ********************************
// $TSFE->config['INTincScript']
// *******************************
if ($TSFE->isINTincScript()) {
$TT->push('Non-cached objects','');
$INTiS_config = $TSFE->config['INTincScript'];
// Special feature: Include libraries
$TT->push('Include libraries');
foreach($INTiS_config as $INTiS_cPart) {
if ($INTiS_cPart['conf']['includeLibs']) {
$INTiS_resourceList = t3lib_div::trimExplode(',',$INTiS_cPart['conf']['includeLibs'],1);
$TT->setTSlogMessage('Files for inclusion: "'.implode(', ',$INTiS_resourceList).'"');
foreach($INTiS_resourceList as $INTiS_theLib) {
$INTiS_incFile = $TSFE->tmpl->getFileName($INTiS_theLib);
if ($INTiS_incFile) {
require_once('./'.$INTiS_incFile);
} else {
$TT->setTSlogMessage('Include file "'.$INTiS_theLib.'" did not exist!',2);
}
}
}
}
$TT->pull();
$TSFE->INTincScript();
$TT->pull();
}
То есть вся обработка USER_INT скриптов ведется в функции $TSFE->INTincScript();
Соответственно тут можно перехватить и либо отдать из кэша, либо пойти по пути генерации как обычно.
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot