HTTP Caching

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

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

  • Last-Modified
  • Etag
  • Cache-Control

Last-Modified Header

Заголовок 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 Header

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

Вы можете настроить свойство yii\filters\HttpCache::$etagSeed, чтобы разрешить отправку заголовка ETag. Свойство должно быть вызовом PHP, возвращающим начальное значение для генерации хэша 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 и ввести ненужные накладные расходы, поскольку их необходимо переоценивать для каждого запроса. Попробуйте найти простое выражение, которое приведет к недействительности кэша, если содержимое страницы было изменено.

Cache-Control Header

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

Cache-Control: public, max-age=3600

Session Cache Limiter

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

SEO Implications

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