Закінчення строку дії HTTP-кешу
Дата оновлення перекладу 2023-09-19
Закінчення строку дії HTTP-кешу
Модель закінчення строку дії - найдієвіша та найпрямолінійніша з двух кешуючих моделей, і повинна бути використана у всіх можливих випадках. Коли відповідь кешується зі строком дії, кеш поовертає його напряму, не звертаючись до додатку до того, як закінчиться дія кешованої відповіді.
Модель закінчення строку дії можна створити, використовуючи один з двох практично
ідентичних HTTP-заголовків: Expires
або 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
може бути встановлений за допомогою
методу setExpires()
Response
. Він бере екземпляр DateTime
в якості аргументу:
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
.