Je suis en train d'utiliser la mise en cache http. Dans mon contrôleur, je suis à la définition d'une réponse comme suit:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
dev mode
En environnement de dev première réponse est un 200 avec en-têtes suivants:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Pour les 2 prochaines minutes chaque réponse est un 304 avec en-têtes suivants:
cache-control:max-age=120, public, s-maxage=120
C'est en fait ce que j'attendais.
prod mode
En prod, mode en-têtes de réponse sont différents. Notez que dans app.php j'enveloppe le noyau dans AppCache.
La première réponse est un 200 avec en-têtes suivants:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
C'est donc un privé no-cache réponse.
Chaque demande est à peu près ce que je m'attendrais qu'il soit; un 304 avec en-têtes suivants:
cache-control:max-age=120, public, s-maxage=120
Dois-je m'inquiéter? Est-ce un comportement attendu?
Ce qui va se passer si je mets du Vernis ou de la Akamai serveur en face de lui?
J'ai fait un peu de débogage et j'ai pensé que la réponse est privé, car de dernière modification de l'en-tête. HttpCache noyau utilise EsiResponseCacheStrategy de mise à jour de la réponse en cache (HttpCache::handle() la méthode).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy tourne une réponse non cachable si il utilise la Dernière Réponse ou ETag (EsiResponseCacheStrategy::add() (méthode):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Réponse::isValidateable() retourne true si la Dernière Réponse ou en-tête ETag est présent.
Il en résulte que dans l'écrasement de l'entête Cache-Control (EsiResponseCacheStrategy::update() (méthode):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
J'ai posé cette question sur Symfony2 groupe d'utilisateurs, mais je n'ai pas eu de réponse à ce jour: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
La mise à jour.
Depuis je n'ai plus accès à l'original du code que j'ai essayé de reproduire le scénario de la dernière Symfony standard edition.
En-têtes de réponse sont plus uniformes, mais semblent être mauvais.
Dès que j'ai mis un Last-Modified
- tête de la réponse, la première réponse faite par un navigateur est:
Cache-Control:must-revalidate, no-cache, private
Deuxième réponse a une durée de:
Cache-Control:max-age=120, public, s-maxage=120
Si je éviter d'envoyer de l' If-Modified-Since
- tête, à chaque demande, les retours must-revalidate, no-cache, private
.
Il n'a pas d'importance si la demande a été faite en prod
ou dev
environnement plus.