Кеширование фрагментов c вариациями. Очистка кеша

Есть некоторый фрагмент, который кешируется


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'])

?

Заранее спасибо за идеи, советы и комментарии

Можно, но выцепить реальный id этого фрагмента довольно трудно (нужно посмотреть в исходниках, как он генерится).

Вот темка на английском: http://www.yiiframework.com/forum/index.php?/topic/8363-fragment-caching

Возможно, стоит посмотреть в сторону зависимостей кэша: http://www.yiiframework.com/doc/guide/ru/caching.data

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