ZhAN
(Zhansoft)
October 15, 2010, 4:28pm
1
Есть некоторый фрагмент, который кешируется
if($this->beginCache('block1', array('duration'=>3600, 'varyByParam'=>array('id')))) {
…кэшируемое содержимое…
$this->endCache(); }
В каком-то другом месте я обновляю данные, которые влияют на валидность кеша для определённого id.
Можно ли как-то после сохранения данных "удалить кеш" блока именно для этого id ?
Или прийдется конструкцию заменить на
if($this->beginCache('block1' .'_'. (int)$_GET['id'], array('duration'=>3600))) {
…кэшируемое содержимое…
$this->endCache(); }
и удалять
Yii::app()->cache->delete('block1' .'_'. (int)$_GET['id'])
?
Заранее спасибо за идеи, советы и комментарии
andy_s
(Arekandrei)
October 15, 2010, 5:04pm
2
Можно, но выцепить реальный id этого фрагмента довольно трудно (нужно посмотреть в исходниках, как он генерится).
Вот темка на английском: http://www.yiiframework.com/forum/index.php?/topic/8363-fragment-caching
Возможно, стоит посмотреть в сторону зависимостей кэша: http://www.yiiframework.com/doc/guide/ru/caching.data
shaa
(Shemyakov Aleksandr)
October 19, 2010, 2:25pm
3
в моей задаче помогло использование CFileCacheDependency
<?php
if($this->beginCache( 'widget-catalog',
array(
'duration'=>3600,
'dependency'=>array(
'class' => 'CFileCacheDependency',
'fileName' => YiiBase::getPathOfAlias('webroot.xml').DIRECTORY_SEPARATOR.'categories.xml',
)
))) { ?>
//....
<?php $this->endCache(); } ?>
Как вариант проверки валидности кэша фрагмента и его очистки - можно хранить дату изменения всех ключей кэша в одном централизированном хранилище, например, в таблице БД, а потом использовать CCacheDependency или его потомков для проверки валидности кэша.
Что-то вроде такого:
Таблица {{cache_modifications}}:
cache_id modified
MainMenu 2011-05-14 16:03:08
BottomMenu 2011-05-14 18:03:08
Кэш главного меню:
…другое HTML-содержимое…
<?php if($this->beginCache('MainMenu', array('dependency'=>array(
'class'=>'system.caching.dependencies.CDbCacheDependency',
'sql'=>"SELECT modified FROM {{cache_modifications}} WHERE cache_id='MainMenu'")))) { ?>
…кэшируемое содержимое…
<?php $this->endCache(); } ?>
…другое HTML-содержимое…
При изменении данных, от которых зависит кэш с id=MainMenu обновлть дату модификации в нашем хранилище. Но в таком случае получим затраты на обращение к хранилищу, для проверки валидности кэша