Sto tentando di utilizzare il caching http. Nel mio controller Sto installando una risposta come segue:Va bene se la prima risposta è privata con AppCache (Symfony2)?
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
modalità dev
Nell'ambiente dev prima risposta è un 200 con i seguenti intestazioni:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
per i prossimi 2 minuti ogni risposta è un 304 con le seguenti intestazioni:
cache-control:max-age=120, public, s-maxage=120
Questo è fondamentalmente quello che mi aspetto che sia.
modalità prod
In prod intestazioni di risposta modalità sono diverse. Si noti che in app.php avvolgo il kernel in AppCache.
prima risposta è un 200 con seguenti intestazioni:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
quindi è una risposta no-cache privata.
Ogni richiesta successiva è praticamente ciò che mi aspetterei che fosse; un 304 con i seguenti intestazioni:
cache-control:max-age=120, public, s-maxage=120
Dovrei preoccuparsi? È un comportamento previsto?
Cosa succede se metto davanti a Varnish o al server Akamai?
Ho eseguito un po 'di debug e ho pensato che la risposta fosse privata a causa dell'intestazione dell'ultima modifica. Kernel HttpCache uses EsiResponseCacheStrategy per aggiornare la risposta memorizzata nella cache (metodo HttpCache::handle()).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy turns a response into non cacheable se utilizza uno Last-risposta o ETag (EsiResponseCacheStrategy::add() metodo):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response::isValidateable() restituisce vero se Last-risposta o ETag è presente.
Essa si traduce in overwriting the Cache-Control header (EsiResponseCacheStrategy::update() metodo):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Ho fatto questa domanda sul gruppo di utenti Symfony2, ma non ho avuto una risposta finora: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Update.
Poiché non ho più accesso al codice originale, ho provato a reproduce the scenario with the latest Symfony standard edition.
Le intestazioni di risposta sono più coerenti ora, ma sembrano ancora sbagliate.
Non appena ho impostato un colpo di testa Last-Modified
sulla risposta, la prima risposta fatta da un browser ha un:
Cache-Control:must-revalidate, no-cache, private
seconda risposta è un atteso:
Cache-Control:max-age=120, public, s-maxage=120
Se evito di invio If-Modified-Since
intestazione, ogni richiesta restituisce must-revalidate, no-cache, private
.
Non importa se la richiesta è stata effettuata nell'ambiente prod
o dev
.
quando ho disattivare il $ kernel = new AppCache ($ kernel); è mostrato come pubblico per me. ma poi risponderà sempre con un codice 200 ... io uso come proxy nginx revery. – Michael
le tue 'app.php' e' app_dev.php' sono le stesse? (ignorando debug e env) – Florian
Non ho più accesso a quel progetto quindi non posso confermarlo. Ricordo che i controller erano quelli predefiniti con AppCache abilitato. –