Sto cercando di utilizzare la cache http. Nel mio controller sto impostando una risposta come segue:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
modalità di sviluppo
In ambiente di sviluppo la prima risposta è un 200 con le 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 è una 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 modalità prod le intestazioni di risposta sono diverse. Nota che in app.php ho inserito il kernel in AppCache.
La prima risposta è una 200 con le seguenti intestazioni:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Quindi è una risposta privata senza cache.
Ogni prossima richiesta è praticamente ciò che mi aspetto che sia; un 304 con le seguenti intestazioni:
cache-control:max-age=120, public, s-maxage=120
Dovrei preoccuparmene? È un comportamento previsto?
Cosa succederà se metto il server Varnish o Akamai di fronte?
Ho fatto un po 'di debug e ho pensato che la risposta fosse privata a causa dell'intestazione modificata per ultima. Il kernel HttpCache utilizza EsiResponseCacheStrategy per aggiornare la risposta memorizzata nella cache ( metodo HttpCache :: handle () ).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy trasforma una risposta in non memorizzabile nella cache se utilizza Last-Response o ETag ( metodo EsiResponseCacheStrategy :: add () ):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () restituisce true se è presente l'intestazione Last-Response o ETag.
Il risultato è la sovrascrittura dell'intestazione Cache-Control ( metodo EsiResponseCacheStrategy :: update () ):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Ho fatto questa domanda sul gruppo di utenti di Symfony2 ma finora non ho ricevuto una risposta: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Aggiornare.
Dato che non ho più accesso al codice originale, ho provato a riprodurre lo scenario con l'ultima edizione standard di Symfony .
Le intestazioni di risposta ora sono più coerenti, ma sembrano ancora sbagliate.
Non appena imposto Last-Modified
un'intestazione sulla risposta, la prima risposta fatta da un browser ha un:
Cache-Control:must-revalidate, no-cache, private
Si prevede una seconda risposta:
Cache-Control:max-age=120, public, s-maxage=120
Se evito di inviare l' If-Modified-Since
intestazione, viene restituita ogni richiesta must-revalidate, no-cache, private
.
Non importa più se la richiesta è stata effettuata prod
o l' dev
ambiente.
app.php
e app_dev.php
lo stesso? (ignorando debug e env)
debug=>true
in GetOptions () in AppCache in modo da ottenere X-Symfony-Cache
di testa?