Я пытаюсь использовать кеширование http. В моем контроллере я устанавливаю ответ следующим образом:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
режим dev
В среде защиты от вирусов первый ответ - 200 со следующими заголовками:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
В течение следующих 2 минут каждый ответ - 304 со следующими заголовками:
cache-control:max-age=120, public, s-maxage=120
В основном это то, что я ожидаю.
режим prod
В заголовках ответов режима prod разные. Обратите внимание, что в app.php я переношу ядро в AppCache.
Первый ответ - 200 со следующими заголовками:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Итак, это частный ответ без кэша.
Каждый следующий запрос - это в значительной степени то, что я ожидаю; 304 со следующими заголовками:
cache-control:max-age=120, public, s-maxage=120
Должен ли я беспокоиться об этом? Это ожидаемое поведение?
Что произойдет, если я поставлю для этого фонарь или сервер Akamai?
Я немного отлаживал, и я понял, что ответ является приватным из-за последнего измененного заголовка. Ядро HttpCache использует EsiResponseCacheStrategy для обновления кэшированного ответа (метод HttpCache:: handle()).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy превращает ответ в не кешируемый, если он использует либо Last-Response, либо ETag (EsiResponseCacheStrategy:: add()):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response:: isValidateable() возвращает true, если присутствует заголовок Last-Response или ETag.
В результате перезаписывается заголовок Cache-Control (метод EsiResponseCacheStrategy:: update()):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Я задал этот вопрос в группе пользователей Symfony2, но пока не получил ответа: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Обновить.
Поскольку у меня больше нет доступа к исходному коду, я попытался воспроизвести сценарий с последней версией Symfony.
Заголовки ответов теперь более согласованы, но все же кажутся неправильными.
Как только я установил заголовок Last-Modified
в ответе, первый ответ, сделанный браузером, имеет:
Cache-Control:must-revalidate, no-cache, private
Ожидается второй ответ:
cache-control:max-age=120, public, s-maxage=120
Если я не отправляю заголовок If-Modified-Since
, каждый запрос возвращает must-revalidate, no-cache, private
.
Не имеет значения, был ли запрос выполнен в среде prod
или dev
.