Я намагаюся використовувати кешування 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
У реальному режимі заголовки відповідей різні. Зауважте, що в app.php я загортаю ядро в AppCache.
Перша відповідь - 200 із наступними заголовками:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Отже, це приватна відповідь без кешу.
Кожен наступний запит майже такий, який я б очікував, що це буде; a 304 із наступними заголовками:
cache-control:max-age=120, public, s-maxage=120
Чи варто турбуватися про це? Це очікувана поведінка?
Що буде, якщо я поставлю перед ним сервер Varnish або Akamai?
Я трохи налагодив, і я зрозумів, що відповідь є приватною через останнє змінене заголовка. HttpCache ядро використовує EsiResponseCacheStrategy для поновлення (кешувати відповідь HttpCache :: ручка () метод).
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.
Це призводить до заміни заголовка кеш-керування ( метод 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
більше.
app.php
і app_dev.php
те саме? (ігноруючи налагодження та оточення)
debug=>true
getOptions () в AppCache, щоб ви отримали X-Symfony-Cache
заголовок?