Ich versuche, http-Caching zu verwenden. In meinem Controller stelle ich eine Antwort wie folgt ein:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
Entwicklungsmodus
In der Entwicklungsumgebung ist die erste Antwort eine 200 mit folgenden Headern:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Für die nächsten 2 Minuten ist jede Antwort eine 304 mit folgenden Überschriften:
cache-control:max-age=120, public, s-maxage=120
Dies ist im Grunde das, was ich erwarte.
Prod-Modus
Im Prod-Modus sind die Antwortheader unterschiedlich. Beachten Sie, dass ich in app.php den Kernel in AppCache einbinde.
Die erste Antwort ist eine 200 mit folgenden Überschriften:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Es handelt sich also um eine private Antwort ohne Cache.
Jede nächste Anfrage ist so ziemlich das, was ich erwarten würde; a 304 mit folgenden Überschriften:
cache-control:max-age=120, public, s-maxage=120
Soll ich mir darüber Sorgen machen? Ist es ein erwartetes Verhalten?
Was passiert, wenn ich einen Lack- oder Akamai-Server davor stelle?
Ich habe ein bisschen debuggt und festgestellt, dass die Antwort aufgrund des zuletzt geänderten Headers privat ist. Der HttpCache-Kernel verwendet EsiResponseCacheStrategy , um die zwischengespeicherte Antwort zu aktualisieren ( HttpCache :: handle () -Methode).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy wandelt eine Antwort in eine nicht zwischenspeicherbare Antwort um, wenn entweder Last-Response oder ETag ( EsiResponseCacheStrategy :: add () -Methode) verwendet wird:
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () gibt true zurück, wenn der Header Last-Response oder ETag vorhanden ist.
Dies führt zum Überschreiben des Cache-Control-Headers ( EsiResponseCacheStrategy :: update () -Methode):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Ich habe diese Frage in der Symfony2-Benutzergruppe gestellt, aber bisher keine Antwort erhalten: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Aktualisieren.
Da ich keinen Zugriff mehr auf den Originalcode habe, habe ich versucht, das Szenario mit der neuesten Symfony-Standardversion zu reproduzieren .
Antwortheader sind jetzt konsistenter, scheinen aber immer noch falsch zu sein.
Sobald ich einen Last-Modified
Header für die Antwort gesetzt habe, hat die erste Antwort eines Browsers Folgendes:
Cache-Control:must-revalidate, no-cache, private
Die zweite Antwort hat eine Erwartung:
Cache-Control:max-age=120, public, s-maxage=120
Wenn ich das Senden von If-Modified-Since
Headern vermeide, wird jede Anfrage zurückgegeben must-revalidate, no-cache, private
.
Es spielt keine Rolle mehr, ob die Anfrage in prod
oder in der dev
Umgebung gestellt wurde.
app.php
und app_dev.php
die gleichen? (ignoriert Debug und env)
debug=>true
getOptions () in AppCache festlegen, damit Sie den X-Symfony-Cache
Header erhalten?