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 — статическая), иначе будут баги
Удачи в кэшировании!