Окочание действия HTTP-кеша

Окочание действия HTTP-кеша

`Модель окончания действия`_ - наиболее действенная и прямолинейная из двух кеширующих моделей, и должна быть использована во всех возможных случаях. Когда ответ кешируется со сроком окончания действия, кеш возвращает его напрямую, не обращаясь к приложению до того, как истечёт действие кешированного ответа.

Модель окончания действия можно создать используя один из двух практически идентичных HTTP-заголовков: Expires или Cache-Control.

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

Tip

Вы также можете определить кеширующие HTTP-заголовки для окончания действия и валидации, используя аннотации. Смотрите документацию FrameworkExtraBundle.

Окончание действия с заголовком Cache-Control

В большинстве случаев вы будете использовать заголовок Cache-Control. Вспомните, что заголовок Cache-Control используется для указания многих разных кеш директив:

1
2
3
// Устанавливает количество секунд, после которых ответ
// больше не должен считаться свежим общими кешами
$response->setSharedMaxAge(600);

Заголовок Cache-Control примет следующий формаи (он может иметь дополнительные директивы):

1
Cache-Control: public, s-maxage=600

Окончание действия с заголовком Expires

Альтернативой заголовку Cache-Control является Expires. В них нет преимуществ и недостатков: они просто представляют собой разные способы установки кеширования окончания действия в вашем ответе.

По обозначению HTTP-спецификации, "Поле заголовка``Expires`` предоставляет дату/время, после которых ответ считается просроченным." Заголовок Expires может быть установлен с помощью метода setExpires() Response. Он берёт экземпляр DateTime в качестве аргумента:

1
2
3
4
$date = new DateTime();
$date->modify('+600 seconds');

$response->setExpires($date);

В результате, HTTP-заголовок будет выглядеть так:

1
Expires: Thu, 01 Mar 2011 16:00:00 GMT

Note

Метод setExpires() автоматически конвертирует дату во временной пояс GMT, как того требует спецификация.

Отметьте, что в HTTP-версиях до 1.1, первоначальный сервер не был обязан отправлять заголовок Date. Следовательно, кешу (например, браузеру) может быть необходимо положиться на локальные часы, чтоб оценить заголовок Expires, что делает расчёт жизненного цикла уязвимым к рассхинхронизации часов. Ещё одно ограничение заголовка Expires заключается в том, что "Серверы HTTP/1.1 не должны отправлять даты Expires далее, чем на один год в будущем."

Note

Согласно RFC 7234 - Caching, значение заголовка Expires игнорируется, когда определена директива s-maxage или max-age заголовка Cache-Control.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.