Кэширование страниц в Yii с помощью COutputCache, и как не закешировать layout

Yii располагает прекрасным инструментарием для кэширования, но совершенно забывает давать хорошие примеры. Сразу спойлер, что проблема возникнет с кэшированием динамически областей шаблона.

yii

Итак, для начала открываем нужный нам контроллер и добавляем в него фильтр COutputCache, призванный кэшировать вывод страницы:

public function filters()

   {
return array(
array(
'COutputCache',
'duration'=>600,//10 минут
'varyByParam'=>array('view'),//название переменной, от которой варьируется вид кэша
),
);
}

Для более тонкой настройки, и кеширования определенных действий(action) контроллера, нужно  подредактировать первый подход

whitelist: 
'COutputCache + index, %название_действия_которое_можно_кешировать%'
blacklist: 
'COutputCache - index, %название_действия_которое_нельзя_кешировать%'

Не забываем включить кэш в config.php:

'components'=>array(
'cache'=>array(
'class'=>'system.caching.CApcCache'
),

Ого, так просто? Нифига! Пробуем, кладем товар в корзину, лазим по статическим страницам, и обнаруживаем БАГ. Ой, оказывается Yii кэширует не только статическую страницу, но и еще совсем-не-статический layout. FUCK!

Теперь, дабы предотвратить кеширование нужных частей шаблона, нужно пометить как динамические с помощью метода $controller->renderDynamic(). Метод устроен хитро, он вызывает метод контроллера, который должен отрендерить этот динамический кусок. В нашем случае, мы будем вызывать renderPartial

1. Создаем вьюху, вырезаем область из шаблон, пастим во вьюху

2. Вставляем на место области <? $this->renderDynamic(‘renderPartial’, ‘//layouts/parts/menu_top’, array(), true)?>

3. Для работы renderDynamic потребуется импортировать класс в config.php 

// autoloading model and component classes
'import'=>array(
'zii.behaviors.CTimestampBehavior' // or 'zii.behaviors.*'
),

Кстати, динамические переменные не стоит передавать в динамический шаблон из layout(получайте их напрямую прямо в самой вьюхе), можно только статические(пример: корзина — динамическая переменная, h1 — статическая), иначе будут баги

Удачи в кэшировании!

Оставить комментарий