Кэширование страниц — это кэширование всего содержимого страницы. Кэширование страниц может встречаться в различных местах. Например, выбрав соответствующий странице заголовок, браузер пользователя может кэшировать просматриваемую страницу на некоторое время. Веб-приложение также может само хранить содержимое страницы в кэше.
Кэширование страницы может быть рассмотрено как частный случай кэширования фрагмента. Из-за того что содержимое страницы часто генерируется применением макета к представлению, кэширование не будет работать, если мы просто вызовем в макете методы beginCache() и endCache(). Причина этого в том, что макет применяется при вызове метода CController::render() после формирования содержимого представления.
Для кэширования всей страницы мы должны пропустить этап формирования содержимого страницы. Для выполнения этой задачи мы можем использовать класс COutputCache как фильтр действия. В коде ниже показано, как можно сконфигурировать фильтр кэша:
public function filters()
{
return array(
array(
'COutputCache',
'duration'=>100,
'varyByParam'=>array('id'),
),
);
}
Вышеприведённая конфигурация создаёт фильтр, применяемый ко всем
действиям контроллера. Мы можем ограничить его применение одним или
несколькими действиями, используя оператор +
.
Подробнее с работой фильтров можно ознакомиться в теме
фильтры.
Подсказка: Мы можем использовать класс COutputCache в качестве фильтра, поскольку он наследует класс CFilterWidget, т.е. оба этих класса одновременно являются и виджетами, и фильтрами. Фактически, способ работы виджета очень похож на работу фильтра: виджет (фильтр) выполняется до того, как любое вложенное содержимое (действие) будет сформировано (выполнено), а выполнение виджета (фильтра) заканчивается после того, как вложенное содержимое (действие) будет сформировано (выполнено).
В дополнение к кешированию всего вывода действия контроллера в 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::lastModifiedExpression, так и CHttpCacheFilter::lastModified могут принимать как Unix timestamp в виде целого числа, так и дату строкой в понятном человеку формате. Если дату может разобрать strtotime(), то никаких дополнительных преобразований не требуется.
Похожим образом, через CHttpCacheFilter::etagSeed и
CHttpCacheFilter::etagSeedExpression, может быть добавлен заголовок
«Entity Tag» (ETag
). Заданные значения сериализуются (то есть можно использовать
как простое значение, так и массив) и затем используются для генерации хеша
quoted base64 SHA1, который подставляется в ETag
. Данный способ отличается от
того, что используется Apache и другими веб-серверами.
Тем не менее, реализация в Yii полностью соответствует RFC и лучше подходит
для использования в фреймворке.
Примечание: Для соответствия разделу 13.3.4 RFC 2616, CHttpCacheFilter отсылает как
ETag
так иLast-Modified
когда это возможно. Соответственно, оба заголовка будут использоваться для инвалидации кэша.
Так как ETag
является хешем, то позволяет реализовать более сложные и точные
стратегии кеширования, чем в случае использования Last-Modified
. К примеру, ETag
может быть инвалидирован в случае изменения темы сайта.
Подсказка: Использование «дорогих» в плане производительности выражений в CHttpCacheFilter::etagSeedExpression может свести на нет ожидаемую выгоду от использования CHttpCacheFilter и даже привести к замедлению приложения потому как используемое выражение выполняется при каждом запросе. Всегда старайтесь найти наиболее простое выражение, показывающее факт изменения содержимого страницы.
Поисковые роботы обычно обращают внимание на заголовки, относящиеся к кэшированию. Так как у некоторых из них есть ограничения на обработку определённого количества страниц одного домена в единицу времени, то использование данной техники может помочь индексации сайта.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.