Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Обсуждение общих технических вопросов > Общие вопросы

Ответ
 
Опции темы Опции просмотра
Старый 30.09.2008, 19:20   #1
demav
Senior Member
 
Аватар для demav
 
Регистрация: 21.04.2006
Сообщений: 245
По умолчанию очистка кеша для определенного урла

Добрый день!

Есть страница, для которой в кеше хранится много записей в зависимости от параметра.
Например, для одной и той же страницы http://site.ru/news/ в кеше будут разные записи для ссылок http://site.ru/news/1/, http://site.ru/news/2/ и т.п.
Таких ссылок могут быть тысячи.

Если чистить кеш для всей страницы, то будут очищены все записи для данной страницы.

Задача такая - надо очистить кеш для заданной записи, а для всех остальных оставить.

Вроде бы можно посчитать hash ссылки, найти соответствующую запись в cache_pages и ее очистить. Но очистки cache_pages недостаточно.

Как лучше сделать описанную задачу? Может есть API или примеры?

Заранее спасибо.
demav вне форума   Ответить с цитированием
Старый 01.10.2008, 13:39   #2
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Полгода назад искал решение этой задачи, спрашивал и в забугорном mail list - решения не нашел. Была мысль проследить путь которым страница кэшируется и сделать алгоритм для обратной операции. Но времени на это не было.

Пошел другим путем. На странице плагин вставлен как USER_INT, а внутри него выдача контента кэшируется в memcached, и очишается соответственно тоже через memcached.

Мне кажется этот путь даже предпочтительней - вместо того, что бы в базе кэшировать 1000 вариантов одной и той же страницы но с разным "центральным" контентом, кэшируется страница один раз - а основной контент кэшируется отдельно. Место это занимает намного меньше, и работает быстрее.
dmartynenko вне форума   Ответить с цитированием
Старый 01.10.2008, 15:16   #3
demav
Senior Member
 
Аватар для demav
 
Регистрация: 21.04.2006
Сообщений: 245
По умолчанию

Логика ясна. В моем случае так заморачиваться - сложно, т.к. на страницах несколько USER_INT элементов, причем на разных страницах - разные. Т.е. нет единого "центрального" контента. Хотя, возможно, имеет смысл.

Как определили, что ваш вариант быстрее? Ведь TYPO3 сначала все равно страницу берет из своего кеша. А только потом ваш модуль еще раз генерит свое содержание (кешированное).

Можно ли где-нибудь посмотреть ваш модуль? Все таки интересно.

По моему вопросу еще можно по идее посмотреть коды модуля clearcacheextend. Но поскольку нет уверенности в его правильности, поэтому решил сначала поинтересоваться у сообщества.
demav вне форума   Ответить с цитированием
Старый 01.10.2008, 15:46   #4
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Оценка "быстрее" конечно чисто умозрительная. Так как испробовать 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 во много-много раз.
dmartynenko вне форума   Ответить с цитированием
Старый 01.10.2008, 16:05   #5
demav
Senior Member
 
Аватар для demav
 
Регистрация: 21.04.2006
Сообщений: 245
По умолчанию

Здорово, спасибо.
В принципе как с memcached работать понятно. Но больше интересовало как "перехватить" контент, который генерит TYPO3, чтобы его положить в кеш.
demav вне форума   Ответить с цитированием
Старый 01.10.2008, 22:53   #6
pomotom
Senior Member
 
Регистрация: 09.12.2007
Сообщений: 281
По умолчанию

есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?
pomotom вне форума   Ответить с цитированием
Старый 02.10.2008, 09:42   #7
razawa
Senior Member
 
Регистрация: 02.03.2007
Адрес: Украина, Дружковка
Сообщений: 128
Отправить сообщение для razawa с помощью ICQ
По умолчанию

Для просмотра кеша конкретной страницы в зависимости от параметров пользуюсь плагином cachemgm (там много параметров кеша выводится) - можно попробовать доработать по типу просмотра индексированных страниц - добавить корзиночку для удаления конкретной записи.
razawa вне форума   Ответить с цитированием
Старый 03.10.2008, 16:46   #8
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

Цитата:
Сообщение от pomotom Посмотреть сообщение
есть ttnewscache и ttnewscache_clearlike - для частичной чистки кеша при работе с tt_news. Возможно, пойдет как пример?
Как-то мне не понравились они (правда смотрел давно).
Если я правильно уловил смысл их работы - в контент страницы добавляется опредленный блок HTML-комметариев, по которому в дальшейшем делается поиск соответсвующей записи в таблице кэша. Мне кажется это очень медленно.
dmartynenko вне форума   Ответить с цитированием
Старый 03.10.2008, 16:57   #9
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

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


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуются разработчики (или компании) для долгосрочного сотрудничества. alex v Работа и заказы / Job Offer and Request 0 30.07.2008 15:32
Очистка кеша при добавлении элемента контента из FE Nikolay Разработка расширений / TYPO3 extension development 2 09.07.2008 14:56
Что использовать для простого каталога? cronfy Магазины и каталоги для TYPO3 4 23.05.2008 12:36
TS-код для размеченой области TV Andrey Grey TypoScript практикум 4 20.02.2008 21:01
Статистика для посетителей сайта thebat TYPO3: SEO и статистика посещений 9 15.12.2007 19:59


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


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

Хостинг и техническая поддержка: TYPO3 Лаборатория