Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Общие вопросы (http://forum.typo3.ru/forumdisplay.php?f=12)
-   -   очистка кеша для определенного урла (http://forum.typo3.ru/showthread.php?t=6800)

demav 30.09.2008 19:20

очистка кеша для определенного урла
 
Добрый день!

Есть страница, для которой в кеше хранится много записей в зависимости от параметра.
Например, для одной и той же страницы 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 вариантов одной и той же страницы но с разным "центральным" контентом, кэшируется страница один раз - а основной контент кэшируется отдельно. Место это занимает намного меньше, и работает быстрее.

demav 01.10.2008 15:16

Логика ясна. В моем случае так заморачиваться - сложно, т.к. на страницах несколько 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'. И по этому же ключу чистить кэш при изменении записи в БД.
Модуль закрытый :) - но все это очень даже просто:

PHP код:

...
    
// соединяемся с 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$dataMEMCACHE_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 во много-много раз.

demav 01.10.2008 16:05

Здорово, спасибо.
В принципе как с memcached работать понятно. Но больше интересовало как "перехватить" контент, который генерит TYPO3, чтобы его положить в кеш.

pomotom 01.10.2008 22:53

есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?

razawa 02.10.2008 09:42

Для просмотра кеша конкретной страницы в зависимости от параметров пользуюсь плагином cachemgm (там много параметров кеша выводится) - можно попробовать доработать по типу просмотра индексированных страниц - добавить корзиночку для удаления конкретной записи.

dmartynenko 03.10.2008 16:46

Цитата:

Сообщение от pomotom (Сообщение 21653)
есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?

Как-то мне не понравились они (правда смотрел давно).
Если я правильно уловил смысл их работы - в контент страницы добавляется опредленный блок HTML-комметариев, по которому в дальшейшем делается поиск соответсвующей записи в таблице кэша. Мне кажется это очень медленно.

dmartynenko 03.10.2008 16:57

Цитата:

Сообщение от demav (Сообщение 21647)
Здорово, спасибо.
В принципе как с memcached работать понятно. Но больше интересовало как "перехватить" контент, который генерит TYPO3, чтобы его положить в кеш.

Если кэшировать вставки USER_INT, то в typo3/sysext/cms/tslib/index_ts.php есть блок:

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();
Соответственно тут можно перехватить и либо отдать из кэша, либо пойти по пути генерации как обычно.


Часовой пояс GMT +4, время: 12:40.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot