Полное руководство по Yii:Кэширование

PHP


Кэширование страниц


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

Кэширование вывода


Кэширование страницы может быть рассмотрено как частный случай кэширования фрагмента. Из-за того что содержимое страницы часто генерируется применением макета к представлению, кэширование не будет работать, если мы просто вызовем в макете методы beginCache() и endCache(). Причина этого в том, что макет применяется при вызове метода CController::render() после формирования содержимого представления.

Для кэширования всей страницы мы должны пропустить этап формирования содержимого страницы. Для выполнения этой задачи мы можем использовать класс COutputCache как фильтр действия. В коде ниже показано, как можно сконфигурировать фильтр кэша:
public function filters()
{
    return array(
        array(
            'COutputCache',
            'duration'=>100,
            'varyByParam'=>array('id'),
        ),
    );
}


Вышеприведённая конфигурация создаёт фильтр, применяемый ко всем действиям контроллера. Мы можем ограничить его применение одним или несколькими действиями, используя оператор +. Подробнее с работой фильтров можно ознакомиться в теме фильтры.

HTTP-кэширование


В дополнение к кешированию всего вывода действия контроллера в Yii с версии 1.1.11 есть CHttpCacheFilter. Данный фильтр отсылает рассматриваемые далее HTTP-заголовки, которые говорят клиенту (чаще всего браузеру), что содержимое страницы не менялось с последнего запроса. В этом случае серверу нет необходимости повторно формировать и отсылать страницу. CHttpCacheFilter настраивается также, как и COutputCache:
public function filters()
{
    return array(
        array(
            'CHttpCacheFilter + index',
            'lastModified'=>Yii::app()->db->createCommand("SELECT MAX(`update_time`) FROM {{post}}")->queryScalar(),
        ),
    );
}


Приведённый выше код добавит заголовок Last-Modified с значением, равным последней дате изменения записи. Также вы можете использовать CHttpCacheFilter::lastModifiedExpression для того, чтобы задать значение Last-Modified при помощи выражения PHP.

Похожим образом, через CHttpCacheFilter::etagSeed и CHttpCacheFilter::etagSeedExpression, может быть добавлен заголовок «Entity Tag» (ETag). Заданные значения сериализуются (то есть можно использовать как простое значение, так и массив) и, затем используются для генерации хеша quoted base64 SHA1, который подставляется в ETag. Данный способ отличается от того, что используется Apache и другими веб-серверами. Тем не менее, реализация в Yii полностью соответствует RFC и лучше подходит для использования в фреймворке.

Так как ETag является хешем, то позволяет реализовать более сложные и точные стратегии кеширования, чем в случае использования Last-Modified. К примеру, ETag может быть инвалидирован в случае изменения темы сайта.

Влияние на SEO


Поисковые роботы обычно обращают внимание на заголовки, относящиеся к кэшированию. Так как у некоторых из них есть ограничения на обработку определённого количества страниц одного домена в единицу времени, то использование данной техники может помочь индексации сайта.

1 комментарий

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

Комментировать при помощи:
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.