2012-03-05 5 views
137

Sto tentando di utilizzare il caching http. Nel mio controller Sto installando una risposta come segue:Va bene se la prima risposta è privata con AppCache (Symfony2)?

$response->setPublic(); 
$response->setMaxAge(120); 
$response->setSharedMaxAge(120); 
$response->setLastModified($lastModifiedAt); 

modalità dev

Nell'ambiente dev prima risposta è un 200 con i seguenti intestazioni:

cache-control:max-age=120, public, s-maxage=120 
last-modified:Wed, 29 Feb 2012 19:00:00 GMT 

per i prossimi 2 minuti ogni risposta è un 304 con le seguenti intestazioni:

cache-control:max-age=120, public, s-maxage=120 

Questo è fondamentalmente quello che mi aspetto che sia.

modalità prod

In prod intestazioni di risposta modalità sono diverse. Si noti che in app.php avvolgo il kernel in AppCache.

prima risposta è un 200 con seguenti intestazioni:

cache-control:must-revalidate, no-cache, private 
last-modified:Thu, 01 Mar 2012 11:17:35 GMT 

quindi è una risposta no-cache privata.

Ogni richiesta successiva è praticamente ciò che mi aspetterei che fosse; un 304 con i seguenti intestazioni:

cache-control:max-age=120, public, s-maxage=120 

Dovrei preoccuparsi? È un comportamento previsto?

Cosa succede se metto davanti a Varnish o al server Akamai?

Ho eseguito un po 'di debug e ho pensato che la risposta fosse privata a causa dell'intestazione dell'ultima modifica. Kernel HttpCache uses EsiResponseCacheStrategy per aggiornare la risposta memorizzata nella cache (metodo HttpCache::handle()).

if (HttpKernelInterface::MASTER_REQUEST === $type) { 
    $this->esiCacheStrategy->update($response); 
} 

EsiResponseCacheStrategy turns a response into non cacheable se utilizza uno Last-risposta o ETag (EsiResponseCacheStrategy::add() metodo):

if ($response->isValidateable()) { 
    $this->cacheable = false; 
} else { 
    // ... 
} 

Response::isValidateable() restituisce vero se Last-risposta o ETag è presente.

Essa si traduce in overwriting the Cache-Control header (EsiResponseCacheStrategy::update() metodo):

if (!$this->cacheable) { 
    $response->headers->set('Cache-Control', 'no-cache, must-revalidate'); 

    return; 
} 

Ho fatto questa domanda sul gruppo di utenti Symfony2, ma non ho avuto una risposta finora: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

Update.

Poiché non ho più accesso al codice originale, ho provato a reproduce the scenario with the latest Symfony standard edition.

Le intestazioni di risposta sono più coerenti ora, ma sembrano ancora sbagliate.

Non appena ho impostato un colpo di testa Last-Modified sulla risposta, la prima risposta fatta da un browser ha un:

Cache-Control:must-revalidate, no-cache, private 

seconda risposta è un atteso:

Cache-Control:max-age=120, public, s-maxage=120 

Se evito di invio If-Modified-Since intestazione, ogni richiesta restituisce must-revalidate, no-cache, private.

Non importa se la richiesta è stata effettuata nell'ambiente prod o dev.

+3

quando ho disattivare il $ kernel = new AppCache ($ kernel); è mostrato come pubblico per me. ma poi risponderà sempre con un codice 200 ... io uso come proxy nginx revery. – Michael

+0

le tue 'app.php' e' app_dev.php' sono le stesse? (ignorando debug e env) – Florian

+1

Non ho più accesso a quel progetto quindi non posso confermarlo. Ricordo che i controller erano quelli predefiniti con AppCache abilitato. –

risposta

-4

Il comportamento che si verifica è destinato. Symfony2 Docs descrive esplicitamente le situazioni in cui sono utilizzati private e public, di default private.

+0

Questo non è il mio caso, mi dispiace. –

7

Ho affrontato lo stesso problema. Ho dovuto fornire intestazioni "pubbliche" il mio cdn. Per impostazione predefinita, quando il caching del gateway è abilitato in modalità prod, restituisce 200 OK con privato, nocache deve convalidare le intestazioni.

Ho risolto il problema in questo modo.

In app.php, prima di inviare risposta all'utente ($ rispondi-> invia), ho sovrascritto l'intestazione del controllo della cache in bianco e ho impostato le intestazioni della cache su pubblico e l'età massima (un certo valore).

// frammento di codice da app.php

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

Hai ricevuto risposte private nonostante fossero state rese pubbliche in un controller? –

+0

Sì, se abilito il caching del gateway ed eseguo in modalità prod. Avevo bisogno di una soluzione superiore per i contenuti statici. – srikanthsatturi