Próbuję użyć buforowania http. W moim kontrolerze ustawiam odpowiedź w następujący sposób:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
tryb deweloperski
W środowisku deweloperskim pierwszą odpowiedzią jest 200 z następującymi nagłówkami:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Przez następne 2 minuty każda odpowiedź to 304 z następującymi nagłówkami:
cache-control:max-age=120, public, s-maxage=120
Zasadniczo tego oczekuję.
tryb prod
W trybie produkcyjnym nagłówki odpowiedzi są różne. Zauważ, że w app.php zawijam jądro w AppCache.
Pierwsza odpowiedź to 200 z następującymi nagłówkami:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Więc jest to prywatna odpowiedź bez pamięci podręcznej.
Każda kolejna prośba jest mniej więcej tym, czego bym się spodziewał; a 304 z następującymi nagłówkami:
cache-control:max-age=120, public, s-maxage=120
Powinienem się tym martwić? Czy jest to oczekiwane zachowanie?
Co się stanie, jeśli postawię przed nim serwer Varnish lub Akamai?
Zrobiłem trochę debugowania i doszedłem do wniosku, że odpowiedź jest prywatna z powodu ostatnio zmodyfikowanego nagłówka. Jądro HttpCache używa EsiResponseCacheStrategy do aktualizacji buforowanej odpowiedzi ( metoda HttpCache :: handle () ).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy zamienia odpowiedź w niebuforowalną, jeśli używa metody Last-Response lub ETag ( metoda EsiResponseCacheStrategy :: add () ):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () zwraca wartość true, jeśli obecny jest nagłówek Last-Response lub ETag.
Powoduje to nadpisanie nagłówka Cache-Control ( metoda EsiResponseCacheStrategy :: update () ):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Zadałem to pytanie na grupie użytkowników Symfony2, ale do tej pory nie otrzymałem odpowiedzi: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Aktualizacja.
Ponieważ nie mam już dostępu do oryginalnego kodu, próbowałem odtworzyć scenariusz w najnowszej standardowej edycji Symfony .
Nagłówki odpowiedzi są teraz bardziej spójne, ale nadal wydają się błędne.
Jak tylko ustawię Last-Modified
nagłówek odpowiedzi, pierwsza odpowiedź wysłana przez przeglądarkę ma:
Cache-Control:must-revalidate, no-cache, private
Druga odpowiedź ma oczekiwane:
Cache-Control:max-age=120, public, s-maxage=120
Jeśli unikam wysyłania If-Modified-Since
nagłówka, każde żądanie wraca must-revalidate, no-cache, private
.
Nie ma znaczenia, czy żądanie zostało już wysłane w środowisku prod
czy w dev
środowisku.
app.php
i app_dev.php
to samo? (ignorując debug i env)
debug=>true
ustawiłbyś getOptions () w AppCache, aby uzyskać X-Symfony-Cache
nagłówek?