2012-03-05 6 views
137

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.

+3

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

+0

son su 'app.php' y' app_dev.php' lo mismo? (ignorando errores y env) – Florian

+1

Ya no tengo acceso a ese proyecto, así que no puedo confirmarlo. Recuerdo que los controladores eran predeterminados con AppCache habilitado. –

Respuesta

-4

El comportamiento que experimentas es intencionado. Symfony2 Docs describen explícitamente las situaciones en las que se usan private y public, por defecto es private.

+0

Este no es mi caso, lo siento. –

7

Me he enfrentado el mismo problema. Tuve que proporcionar encabezados 'públicos' mi CDN. De forma predeterminada, cuando el almacenamiento en caché de la puerta de enlace está habilitado en el modo prod, se devuelve 200 OK con privado, nocache debe validar los encabezados.

He resuelto el problema de esta manera.

En app.php, antes de enviar una respuesta al usuario ($ responder-> enviar), he sobrescrito el encabezado de control de caché a blanco y establezco los encabezados de caché en público y la antigüedad máxima (algún valor).

// fragmento de código app.php

$response = $kernel->handle($request); 
    $response->headers->set('Cache-Control', ''); 
    $response->setPublic(); 
    $response->setMaxAge(86400); 
    $response->send();   
+0

¿Recibió respuestas privadas a pesar de que se establecieron en un controlador público? –

+0

Sí, si habilito el almacenamiento en caché de la puerta de enlace y lo ejecuto en el modo prod. Necesitaba la solución anterior para contenidos estáticos. – srikanthsatturi

Cuestiones relacionadas