J'essaye d'utiliser la mise en cache http. Dans mon contrôleur, je règle une réponse comme suit:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
mode de développement
Dans l'environnement de développement, la première réponse est un 200 avec les 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 les en-têtes suivants:
cache-control:max-age=120, public, s-maxage=120
C'est essentiellement ce à quoi je m'attends.
mode prod
En mode production, les 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 les en-têtes suivants:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
C'est donc une réponse privée sans cache.
Chaque demande suivante correspond à peu près à ce que j'attendais; un 304 avec les en-têtes suivants:
cache-control:max-age=120, public, s-maxage=120
Dois-je m'en soucier? Est-ce un comportement attendu?
Que se passera-t-il si je place le serveur Varnish ou Akamai devant lui?
J'ai fait un peu de débogage et j'ai pensé que la réponse était privée en raison de l'en-tête modifié en dernier. Le noyau HttpCache utilise EsiResponseCacheStrategy pour mettre à jour la réponse mise en cache ( méthode HttpCache :: handle () ).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy transforme une réponse en non mise en cache si elle utilise Last-Response ou ETag ( méthode EsiResponseCacheStrategy :: add () ):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () retourne true si l'en-tête Last-Response ou ETag est présent.
Il en résulte l' écrasement de l'en-tête Cache-Control ( méthode EsiResponseCacheStrategy :: update () ):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
J'ai posé cette question sur le groupe d'utilisateurs Symfony2 mais je n'ai pas encore obtenu de réponse: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Mettre à jour.
Comme je n'ai plus accès au code original, j'ai essayé de reproduire le scénario avec la dernière édition standard de Symfony .
Les en-têtes de réponse sont plus cohérents maintenant, mais semblent toujours être erronés.
Dès que j'ai défini un en- Last-Modified
tête sur la réponse, la première réponse faite par un navigateur a un:
Cache-Control:must-revalidate, no-cache, private
La deuxième réponse a un attendu:
Cache-Control:max-age=120, public, s-maxage=120
Si j'évite d'envoyer un en- If-Modified-Since
tête, chaque demande revient must-revalidate, no-cache, private
.
Peu importe si la demande a été faite dans prod
ou dans l' dev
environnement.
app.php
et app_dev.php
les mêmes? (ignorant le débogage et env)
debug=>true
getOptions () dans AppCache pour obtenir l'en- X-Symfony-Cache
tête?