Estoy tratando de usar http caching. En mi controlador Soy la creación de una respuesta de la siguiente manera:¿Está bien si la primera respuesta es privada con AppCache (Symfony2)?
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
modo dev
entorno de desarrollo en la primera respuesta es un 200 con siguientes encabezados:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
para los próximos 2 minutos cada respuesta es un 304 con los siguientes encabezados:
cache-control:max-age=120, public, s-maxage=120
Esto es básicamente lo que espero que sea.
modo prod
En las cabeceras de respuesta modo prod son diferentes. Tenga en cuenta que en app.php envuelvo el kernel en AppCache.
primera respuesta es un 200 con siguientes encabezados:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
lo que es una respuesta no-cache privado.
Cada próxima solicitud es más o menos lo que yo esperaba; un 304 con siguientes encabezados:
cache-control:max-age=120, public, s-maxage=120
¿Debo preocuparme? ¿Es un comportamiento esperado?
¿Qué pasará si pongo el servidor Varnish o Akamai delante de él?
Hice un poco de depuración y calculé que la respuesta es privada debido al encabezado modificado. HttpCache kernel uses EsiResponseCacheStrategy para actualizar la respuesta en caché (método HttpCache::handle()).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy turns a response into non cacheable si utiliza ya sea Última-Response o ETag (EsiResponseCacheStrategy::add() método):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response::isValidateable() devuelve verdadero si Última-Response o encabezado ETag está presente.
resulta en overwriting the Cache-Control header (EsiResponseCacheStrategy::update() método):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
hice esta pregunta en el grupo de usuarios de Symfony2, pero no he tenido una respuesta hasta el momento: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
actualización.
Como ya no tengo acceso al código original, traté de reproduce the scenario with the latest Symfony standard edition.
Los encabezados de respuesta son más consistentes ahora, pero aún parecen estar equivocados.
Tan pronto como establecer una cabecera Last-Modified
de la respuesta, la primera respuesta hecha en el navegador tiene una:
Cache-Control:must-revalidate, no-cache, private
Segunda respuesta ha de esperarse:
Cache-Control:max-age=120, public, s-maxage=120
Si puedo evitar el envío If-Modified-Since
encabezado, cada solicitud devuelve must-revalidate, no-cache, private
.
No importa si la solicitud se realizó en el entorno prod
o dev
.
cuando desactivo el kernel $ = new AppCache ($ kernel); se muestra como público para mí. pero luego siempre responderá con un código 200 ... lo uso como proxy revery nginx. – Michael
son su 'app.php' y' app_dev.php' lo mismo? (ignorando errores y env) – Florian
Ya no tengo acceso a ese proyecto, así que no puedo confirmarlo. Recuerdo que los controladores eran predeterminados con AppCache habilitado. –