Кеширование виджета

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Jazz
Сообщения: 41
Зарегистрирован: 2012.01.10, 16:54

Кеширование виджета

Сообщение Jazz »

Хочу сделать кеширование самодельного виджета в main-лэйауте. Виджет выводит несколько блоков информации, данные для которых получаются запросом к базе. Кэш должен становиться невалидным в случае если, какие-то данные моделей изменились.
Решил вначале сделать обычным образом, описанным в руководстве:

Код: Выделить всё

<?php if($this->beginCache('Newswidget',array('duration' => 10*60))): ?>
    <?php $this->widget('application.widgets.NewsWidget', array('param' => 1)) ?>
    <?php $this->endCache() ?>
<?php endif ?>
Но тут получается с одной стороны - кэш фрагмента страницы, а с другой стороны - он зависит от данных, которые выводятся в этом фрагменте.
Хотелось бы чтобы этот кэш сбрасывался, например, в методах afterSave и afterDelete нужной модели.
Как лучше поступить? Желательно без лишних запросов к базе.
Аватара пользователя
artos
Сообщения: 38
Зарегистрирован: 2011.05.17, 17:20

Re: Кеширование виджета

Сообщение artos »

ну так и удаляйте кэш в событиях afterSave и afterDelete:

Yii::app()->cache->delete('Newswidget');
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Кеширование виджета

Сообщение futbolim »

какой кеш, если Вам нужно каждый раз чекать данные ?
кешируйте его данные
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Кеширование виджета

Сообщение futbolim »

artos писал(а):ну так и удаляйте кэш в событиях afterSave и afterDelete:

Yii::app()->cache->delete('Newswidget');
и смысл кеша тогда ?
Аватара пользователя
artos
Сообщения: 38
Зарегистрирован: 2011.05.17, 17:20

Re: Кеширование виджета

Сообщение artos »

Смысл не делать запросов если ничего не изменилось. Вызов методов afterSave и afterDelete говорит о том, что модель изменилась, соответственно нужно сбросить кэш.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Кеширование виджета

Сообщение futbolim »

artos писал(а):Смысл не делать запросов если ничего не изменилось
а как можно понять, что ничего не изменилось не сделав запроса ?
Аватара пользователя
artos
Сообщения: 38
Зарегистрирован: 2011.05.17, 17:20

Re: Кеширование виджета

Сообщение artos »

Если у тебя данные таблицы меняются только через модель, то 100% можно верить, что ничего не изменилось, так как мы ловим события изменения в модели
Аватара пользователя
Jazz
Сообщения: 41
Зарегистрирован: 2012.01.10, 16:54

Re: Кеширование виджета

Сообщение Jazz »

artos писал(а):ну так и удаляйте кэш в событиях afterSave и afterDelete:

Yii::app()->cache->delete('Newswidget');
Я так и пробовал изначально. Не удаляет. Предполагаю, что таким образом можно сбросить только кэш, который создавался через:

Код: Выделить всё

Yii::app()->cache->set('Newswidget', $news, 60 * 60);
В этом и проблема.

А для удаления такого:

Код: Выделить всё

$this->beginCache('Newswidget',array('duration' => 10*60))
 
нужен какой-то другой механизм.
Ответить