141 votes

Est-ce bien si la première réponse est privée avec AppCache (Symfony2)?

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.

9voto

srikanthsatturi Points 21

J'ai rencontré le même problème. J'ai dû fournir des en-têtes «publics» à mon cdn. Par défaut, lorsque la mise en cache de la passerelle est activée en mode prod, elle renvoie 200 OK avec private, nocache doit valider les en-têtes.

J'ai résolu le problème de cette façon.

Dans app.php, avant d'envoyer une réponse à l'utilisateur ($ respond-> send), j'ai écrasé l'en-tête du contrôle du cache et défini les en-têtes du cache sur public et max age (une valeur).

// extrait de code depuis app.php

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

-4voto

Udan Points 2739

Le comportement que vous rencontrez est destiné. Symfony2 Docs décrit explicitement les situations où privé et public sont utilisés, la valeur par défaut étant privée .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X