Spec-Zone.ru › Yii 2.0

Кэширование HTTP

  1. Заголовок Last-Modified
  2. Заголовок ETag
  3. Заголовок Cache-Control
  4. Ограничитель кэша сеанса
  5. Последствия для SEO

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

Чтобы использовать кэширование на стороне клиента, можно настроить yii\filters\HttpCache в качестве фильтра для действий контроллера, результат отрисовки которых можно кэшировать на стороне клиента. HttpCache работает только для GET и HEAD запросов. Он может обрабатывать три типа HTTP-заголовков, связанных с кэшем, для этих запросов:

  • Last-Modified
  • Etag
  • Cache-Control

Last-Modified Заголовок

Заголовок Last-Modified использует отметку времени для указания того, была ли страница изменена после того, как клиент ее кэшировал.

Можно настроить свойство yii\filters\HttpCache::$lastModified для включения отправки заголовка Last-Modified. Свойство должно быть вызываемым PHP, возвращающим метку времени Unix, связанную со временем изменения страницы. Подпись вызываемого PHP должна быть следующей,

/**
 * @param Action $action the action object that is being handled currently
 * @param array $params the value of the "params" property
 * @return int a UNIX timestamp representing the page modification time
 */
function ($action, $params)

Ниже приведен пример использования заголовка Last-Modified:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('post')->max('updated_at');
            },
        ],
    ];
}

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

ETag Заголовок

Заголовок "Entity Tag" (или ETag сокращенно) использует хеш для представления содержимого страницы. Если страница изменена, хеш также изменится. Сравнивая хеш, хранящийся на стороне клиента, с хешем, сгенерированным на стороне сервера, кэш может определить, была ли страница изменена и должна ли она быть повторно передана.

Можно настроить свойство yii\filters\HttpCache::$etagSeed для включения отправки заголовка ETag. Свойство должно быть вызываемым PHP, возвращающим seed для генерации хеша ETag. Подпись вызываемого PHP должна быть следующей,

/**
 * @param Action $action the action object that is being handled currently
 * @param array $params the value of the "params" property
 * @return string a string used as the seed for generating an ETag hash
 */
function ($action, $params)

Ниже приведен пример использования заголовка ETag:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['view'],
            'etagSeed' => function ($action, $params) {
                $post = $this->findModel(\Yii::$app->request->get('id'));
                return serialize([$post->title, $post->content]);
            },
        ],
    ];
}

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

ETags позволяют более сложные и/или более точные стратегии кэширования, чем заголовки Last-Modified. Например, ETag может быть аннулирован, если сайт переключился на другую тему.

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

Примечание: В соответствии с RFC 7232, HttpCache будет отправлять как заголовки ETag, так и Last-Modified, если они оба настроены. И если клиент отправляет как заголовок If-None-Match, так и заголовок If-Modified-Since, будет уважаться только первый.

Cache-Control Заголовок

Заголовок Cache-Control определяет общую политику кэширования страниц. Его можно отправить, настроив свойство yii\filters\HttpCache::$cacheControlHeader со значением заголовка. По умолчанию отправляется следующий заголовок:

Cache-Control: public, max-age=3600

Ограничитель кэша сеанса

Когда страница использует сеанс, PHP автоматически отправляет некоторые HTTP-заголовки, связанные с кэшем, как указано в настройке PHP INI session.cache_limiter. Эти заголовки могут мешать или отключать кэширование, которое вы хотите от HttpCache. Чтобы предотвратить эту проблему, по умолчанию HttpCache отключит автоматическую отправку этих заголовков. Если вы хотите изменить это поведение, следует настроить свойство yii\filters\HttpCache::$sessionCacheLimiter. Свойство может принимать строковое значение, включая public, private, private_no_expire и nocache. Обратитесь к руководству PHP по session_cache_limiter() за объяснениями этих значений.

Последствия для SEO

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

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-caching-http.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API