Срок действия HTTP-кеша

Дата обновления перевода 2023-09-19

Срок действия HTTP-кеша

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

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

Дата обновления перевода 2023-01-16

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

Tip

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

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

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

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(public: true, maxage: 600)]
public function index(): Response
{
    // ...
}

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

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

Note

Использование метода setSharedMaxAge() не эквивалентно использованию методов setPublic() и setMaxAge(). В соответствии с разделом Выдача несвежих ответов в RFC 7234, настройка s-maxage (добавленная методом setSharedMaxAge()) запрещает кешу использовать несвежий ответ в сценариях stale-if-error. Поэтому рекомендуется использовать директивы public и max-age.

Срок действия с заголовком Expires

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

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

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(expires: '+600 seconds')]
public function index(): Response
{
    // ...
}

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

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

Note

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

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

Note

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