Закінчення строку дії HTTP-кешу

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

Закінчення строку дії HTTP-кешу

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

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

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

Tip

Ви також можете визначити HTTP заголовки кешування для закінчення строку дії та валідації, використовуючи анотації. Див. документацію FrameworkExtraBundle.

Закінчення строку дії з заголовком 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.