Cache HTTP


DiffCet article est dérivé du BOOK et est différent des documents officiels existants. Cet article l'explique plus en profondeur et en détail à certains endroits. Nous n’avons donc pas forcé la synchronisation avec l’officiel.

L'attribut naturel des applications Web riches est qu'elles sont dynamiques. Quelle que soit l'efficacité de votre programme, chaque requête entraînera toujours une surcharge bien plus importante que les fichiers statiques.

Plus de programmes Web n'ont pas été grandement affectés. Symfony est ultra-rapide, et à moins que vous ne fassiez quelque chose de très lourd, chaque requête est restaurée rapidement sans mettre trop de pression sur le serveur.

Mais à mesure que votre site grandit, la surcharge peut devenir un problème. Le traitement des demandes typiques ne doit être effectué qu’une seule fois. Et c’est exactement l’objectif du verrouillage du cache.

La mise en cache sur les épaules des géants

Le moyen le plus efficace d'améliorer les performances d'un programme est de mettre en cache l'intégralité de la sortie de la page, puis d'ignorer l'intégralité de la requête ultérieure. Bien entendu, pour les sites Web très dynamiques, cela n’est pas toujours le cas. Dans ce chapitre, vous apprendrez comment fonctionne le système de mise en cache de Symfony et pourquoi c'est la meilleure solution.

Le système de mise en cache Symfony est différent car il repose sur la simplicité et la puissance du cache HTTP défini par la spécification HTTP. Plutôt que de réinventer une approche de mise en cache, Symfony met l'accent sur les normes qui définissent les communications de base sur le Web. Une fois que vous maîtrisez les bases de la « validation HTTP » et de « l’expiration des modèles mis en cache », vous pouvez déjà maîtriser le système de mise en cache de Symfony.

Le processus d'apprentissage du cache Symfony peut être divisé en quatre étapes :

  1. Le cache passerelle, ou proxy inverse, est une couche indépendante devant votre programme. Un proxy inverse met en cache les réponses au fur et à mesure qu'elles sont renvoyées par votre programme ; il peut également répondre aux requêtes avec des réponses mises en cache avant que la requête n'atteigne votre programme. Symfony fournit son propre proxy inverse, mais n'importe quel proxy inverse fonctionnera.

  2. Cache HTTPL'en-tête de cache HTTP est utilisé entre votre programme et le client pour communiquer avec le cache de passerelle ou d'autres caches. Symfony fournit une configuration par défaut raisonnable et une interface puissante pour interagir avec les en-têtes de cache.

  3. HTTPexpiration et validation, ces deux modèles sont utilisés pour déterminer si le contenu mis en cache est fresh/fresh (peut être réutilisé depuis le cache), ou s'il est stale/stale (doit être régénéré par le programme)

  4. Edge Side Include (ESI), les inclusions latérales de bord permettent d'utiliser le cache HTTP pour la mise en cache indépendante de parties de la page (même des fragments imbriqués). Avec l'aide d'ESI, vous pouvez même « mettre en cache la page entière pendant 60 minutes, mais la barre latérale pendant seulement 5 minutes ».

Le cache HTTP n'étant pas exclusif à Symfony, il existe de nombreux articles connexes. Si vous n'êtes pas familier avec la mise en cache HTTP, je vous recommande fortement de lire Things Caches Do de Ryan Tomayko. Un autre bon article approfondi est le Cache Tutorial de Mark Nottingham.

Utilisation du cache de passerelle

Lors de l'utilisation de la mise en cache HTTP, cache est complètement distinct de votre programme, il se situe entre votre programme et le client qui fait la demande.

La tâche de la mise en cache est de recevoir les demandes des clients, puis de les renvoyer à votre programme, puis de les renvoyer au client. Le cache ici est « l’intermédiaire » dans le processus de communication « requête-réponse » entre le programme et le navigateur.

Au fil du temps, ces caches stockeront chaque réponse jugée « pouvant être mise en cache » (voir Introduction à la mise en cache HTTP). Si la même ressource est demandée à nouveau, le cache enverra la réponse mise en cache au client, ignorant complètement votre application.

Ce type de cache est le cache de passerelle HTTP, qui existe dans les proxys inverses tels que Varnish, Squid en mode proxy inverse et Symfony.

Types de cache

Mais le cache Gateway n'est pas le seul type de cache. En fait, les en-têtes de cache HTTP envoyés par votre programme sont supposés être interprétés par jusqu'à trois méthodes de mise en cache :

  • Caches de navigateur : Chaque navigateur possède son propre cache local intégré, utilisé lorsque vous cliquez sur "Retour". ", ou utilisé pour les images et autres actifs. Le cache du navigateur est un cache privé (privé), car les ressources mises en cache ne peuvent pas être utilisées par d'autres.

  • Caches proxy (caches proxy) : Le proxy fait référence à un cache partagé (partagé), car de nombreuses personnes Peut être suivi (pour être utilisé) par quelqu'un. Généralement utilisé par les grandes entreprises ou les FAI pour réduire la latence d'accès et le trafic réseau.

  • Caches passerelles : Semblable à un proxy, c'est aussi un cache partagé, mais côté serveur. Souvent utilisé par les administrateurs réseau pour rendre les sites Web plus faciles à mettre à niveau, plus fiables et plus performants.

Les caches de passerelle font parfois référence aux caches de proxy inverse, aux caches de substitution (caches proxy) et même aux accélérateurs HTTP.

L'importance de la mise en cache privée (private) et partagée (shared) augmente lorsque la situation dans laquelle les réponses mises en cache contiennent du contenu spécifique à l'utilisateur (tel que des informations de compte) est discutée.

Chaque réponse du programme connaîtra l'un ou les deux premiers types de cache. Ces caches échappent à votre contrôle (de programme), mais obéissent aux instructions de mise en cache HTTP définies dans la réponse.

Symfony Reverse Proxy

Symfony dispose d'un proxy inverse intégré (également appelé cache de passerelle) écrit en PHP. Ce n'est pas un cache proxy inverse complet comme Varnish, mais c'est un bon début.

Pour plus de détails sur la configuration de Varnish, reportez-vous à Comment accélérer mon site Web avec Varnish .

Activer le proxy est simple : les programmes Symfony ont tous un noyau de cache pré-construit (AppCache), qui emballe le noyau par défaut (AppKernel). Ce noyau de mise en cache est en fait un proxy inverse. AppCache),它把默认的核心(AppKernel)给打包。这个缓存核心就是 反向代理。

开启缓存很容易,修改你的前端控制器代码。你也可以在app_dev.php中做出这些改变,即可为dev环境添加缓存:

// web/app.phpuse Symfony\Component\HttpFoundation\Request;
// ...$kernel = new AppKernel('prod', false);$kernel->loadClassCache(); 
// add (or uncomment) this new line! / 添加下面新行!
// wrap the default AppKernel with the AppCache one
// 用AppCache打包默认的AppKernel$kernel = new AppCache($kernel); $request = Request::createFromGlobals(); $response = $kernel->handle($request);$response->send(); $kernel->terminate($request, $response);

上面的缓存核心,将立即作为反向代理来运作——从你的程序中缓存响应,然后把它们返回到客户端。

如果你正使用framework.http_method_override选项,来从_method参数中读取HTTP方法,参考上面链接来调整到你需要的程度。

缓存核心有一个特殊的getLog()

L'activation de la mise en cache est simple, il suffit de modifier le code de votre contrôleur frontal. Vous pouvez également apporter ces modifications dans app_dev.php pour ajouter un cache pour l'environnement dev :
1
Le noyau de cache ci-dessus agira immédiatement comme un proxy inverse. Opération - Cache réponses de votre candidature et les renvoyer au client.
Si vous utilisez framework.http_method_override
pour lire la méthode HTTP à partir du paramètre _method. Reportez-vous au lien ci-dessus pour l'ajuster selon vos besoins.
Le noyau de cache a une méthode spéciale getLog() qui renvoie une chaîne pour indiquer ce qui s'est exactement passé dans la couche de cache. Dans un environnement de développement, vous pouvez l'utiliser pour déboguer ou valider votre stratégie de mise en cache.
🎜🎜🎜🎜
error_log($kernel->getLog());
🎜🎜🎜🎜
// app/AppCache.phpuse Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; class AppCache extends HttpCache{
    protected function getOptions()
    {
        return array(
            'debug'                  => false,
            'default_ttl'            => 0,
            'private_headers'        => array('Authorization', 'Cookie'),
            'allow_reload'           => false,
            'allow_revalidate'       => false,
            'stale_while_revalidate' => 2,
            'stale_if_error'         => 60,
        );
    }}
🎜🎜🎜🎜🎜

L'objet AppCache a une configuration par défaut adaptée, mais en remplaçant getOptions() pour définir un ensemble d'options, l'objet peut être affiné. AppCache对象有一个合适的默认配置,但是通过覆写getOptions()方法来设置一组选项,该对象即可被精细调整。

Cache-Control: private, max-age=0, must-revalidate
 
Cache-Control: max-age=3600, must-revalidate


除非在getOptions()方法中进行覆写,否则debub选项将被自动设成“被剥离出来的AppKernel

// ... use Symfony\Component\HttpFoundation\Response; $response = new Response();
// mark the response as either public or private 标记响应是公有还是私有$response->setPublic();$response->setPrivate();
// set the private or shared max age 设置私有或公有的最大周期$response->setMaxAge(600);$response->setSharedMaxAge(600); 
// set a custom Cache-Control directive 设置一个自定义Cache-Control命令$response->headers->addCacheControlDirective('must-revalidate', true)


🎜À moins d'être remplacée dans la méthode getOptions(), l'option debub sera définie automatiquement à la valeur de débogage dans le "AppKernel supprimé". 🎜🎜


Voici quelques-unes des principales options :

default_ttldefault_ttl

数值是秒,表达的是当响应中没有提供明确的新鲜度信息时,一个缓存入口被认为是fresh的时长。显式指定Cache-ControlExpires头,可以覆写这个值(默认是0)。


private_headers

一组请求头,在没有“通过Cache-Control指令(默认是AuthorizationCookie)明确声明当前响应是public还是private状态”的响应中,触发“private”Cache-Control行为。


allow_reload

指定客户端是否可以在请求中包容一个Cache-Control的“no-cache”指令来强制重新加载缓存。设为true即可遵守RFC2616(默认是false)。


allow_revalidate

指定客户端是否可以在请求中包容一个来Cache-Control的“max-age=0”来强制重新验证。设为true即可遵守RFC2616(默认是false)。


stale_while_revalidate

指定的默认秒数(以秒为间隔是因为Response的TTL精度是秒),在此期间,尽管缓存在后台对响应正进行重新验证,但它能够立即返回一个不新鲜的响应(默认值是2);本设置可被HTTPCache-Control扩展的stale-while-revalidate覆写(参考RFC 5861)。


stale_if_error

指定的默认秒数(间隔是秒),在此期间,缓存可以对遇到错误的响应提供服务(默认值是60)。本设置可被HTTPCache-Control扩展的stale-if-error覆写(参考RFC 5861)。


如果debug被设为true,Symfony将自动添加一个X-Symfony-Cache

La valeur est en secondes, ce qui exprime la durée pendant laquelle une entrée de cache est considérée comme fraîche lorsqu'aucune information claire sur la fraîcheur n'est fournie dans la réponse. Cette valeur peut être remplacée en spécifiant explicitement l'en-tête Cache-Control ou Expires (la valeur par défaut est 0).

private_headers

Un ensemble d'en-têtes de requête qui peuvent être utilisés sans "passer Cache-Control (par défaut Authorization et Cookie) déclarent explicitement si la réponse actuelle est publique ou privée. "Dans la réponse, le comportement Cache-Control "privé" est déclenché.


allow_reload#🎜🎜##🎜🎜#Spécifiez si le client peut inclure un Cache dans la requête -La directive "no-cache" de Control pour forcer un rechargement du cache. Défini sur true pour être conforme à la RFC2616 (la valeur par défaut est false). #🎜🎜#
#🎜🎜##🎜🎜#allow_revalidate#🎜🎜##🎜🎜#Spécifie si le client peut en inclure un dans la requête Cache -Contrôlez "max-age=0" de pour forcer la revalidation. Défini sur true pour être conforme à la RFC2616 (la valeur par défaut est false). #🎜🎜#
#🎜🎜##🎜🎜#stale_while_revalidate#🎜🎜##🎜🎜#Le nombre de secondes par défaut spécifié (l'intervalle en secondes est dû au fait que le Réponse La précision du TTL est de quelques secondes), pendant lesquelles le cache peut immédiatement renvoyer une réponse obsolète (la valeur par défaut est 2), bien que le cache revalide la réponse en arrière-plan, ce paramètre peut être utilisé par HTTP ; Remplacement Cache-Control étendu de stale-while-revalidate (voir RFC 5861). #🎜🎜#
#🎜🎜##🎜🎜#stale_if_error#🎜🎜##🎜🎜#Spécifie le nombre de secondes par défaut (l'intervalle est en secondes) pendant lesquelles , le cache peut servir les réponses qui rencontrent des erreurs (la valeur par défaut est 60). Ce paramètre peut être remplacé par le stale-if-error de l'extension HTTP Cache-Control (voir RFC 5861). #🎜🎜#
#🎜🎜#Si debug est défini sur true, Symfony ajoutera automatiquement un X-Symfony-Cache en-tête de la réponse, qui contient des informations utiles sur les succès et les échecs du cache. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Passer d'un proxy inverse à un autre #🎜🎜##🎜🎜# lors du développement d'un site web, ou lors du déploiement d'un site web vers "rien que du code php" Pendant le processus d'installation de l'hébergement mutualisé, le proxy inverse de Symfony est un outil extrêmement utile. Mais comme il est écrit en PHP, il n’est pas aussi rapide que le proxy écrit en C. C'est pourquoi il est fortement recommandé d'utiliser Vanish ou Squid sur les serveurs de production autant que possible. La bonne nouvelle est que passer d’un serveur proxy à un autre est simple et transparent car il n’y a aucun code à modifier dans votre programme. Vous pouvez utiliser le proxy inverse Symfony en toute tranquillité d'esprit et vous pouvez passer à Varnish à tout moment lorsque votre trafic augmente à l'avenir. #🎜🎜##🎜🎜##🎜🎜#

Les performances du proxy inverse Symfony sont indépendantes de la complexité du programme. En effet, le noyau du programme n'est démarré que lorsqu'une requête doit lui être envoyée.

Créez vos réponses en cache HTTP

Pour profiter des couches de mise en cache disponibles, votre programme doit communiquer avec les informations suivantes : 1. Quelles réponses peuvent être mises en cache. 2. Règles qui déterminent quand/comment le cache devient obsolète.

N'oubliez pas que "HTTP" n'est qu'un langage (texte simple), utilisé par les clients et les serveurs pour communiquer entre eux. La mise en cache HTTP fait partie de ce langage, permettant aux clients et aux serveurs d'échanger des informations sur la mise en cache.

HTTP spécifie les quatre en-têtes de mise en cache suivants pour les réponses :

  • Cache-ControlCache-Control

  • Expires

  • ETag

  • Last-Modified

其中最为重要和功能最强的当属Cache-Control头,它可说是多种缓存信息的集合。

每种头都在HTTP Expiration,Validation和Invalidation小节中进行了详解。

Cache-Control头 

Cache-Control头是特殊的,它包含不止一条,而是很多条和响应的缓存能力相关的信息。每种信息被以英文逗号分隔开来:

$date = new DateTime();
$date->modify('+600 seconds'); 
$response->setExpires($date);

Symfony提供了一个关于Cache-Control

Expires

ETag

Last-Modified
Le plus important et le plus puissant est sans aucun doute Cache-Control< /code> en-tête, qui peut être considéré comme une collection de diverses informations de cache. 🎜🎜🎜🎜Chaque en-tête est expliqué en détail dans les sections Expiration HTTP, Validation et Invalidation🎜. 🎜🎜🎜

En-tête Cache-Control ¶🎜

🎜L'en-tête Cache-Control est spécial, qui contient non seulement une information, mais de nombreuses informations liées à la capacité de mise en cache de la réponse. Chaque information est séparée par des virgules : 🎜
Expires: Thu, 01 Mar 2011 16:00:00 GMT
🎜Symfony fournit une couche d'abstraction sur l'en-tête Cache-Control pour rendre sa création plus gérable : 🎜🎜
// Sets the number of seconds after which the response
// should no longer be considered fresh// 设置“响应过期”的秒数$response->setMaxAge(600);
 // Same as above but only for shared caches
// 同上,但仅用于共享缓存$response->setSharedMaxAge(600);
🎜🎜🎜 Si vous souhaitez définir des en-têtes de cache pour différentes actions dans votre contrôleur, vous souhaiterez peut-être jeter un œil au 🎜FOSHttpCacheBundle🎜. Il fournit un moyen de définir les en-têtes de cache en fonction de la correspondance de modèles d'URL et d'autres attributs de requête. 🎜🎜🎜

Réponse publique et Réponse privée

Qu'il s'agisse d'un cache passerelle ou d'un cache proxy, il est considéré comme un cache partagé "partagé", car le contenu du cache est partagé par plus d'utilisateurs partagent. Si une réponse « spécifique à l'utilisateur » est placée par erreur dans un cache partagé, elle peut être renvoyée ultérieurement à plusieurs utilisateurs différents. Imaginez simplement ce que ce serait si les informations de votre compte étaient mises en cache puis envoyées à tous les utilisateurs ultérieurs qui ont demandé leur page de compte !

Pour faire face à cette situation, chaque réponse doit être définie sur publique ou privée :

public

# 🎜🎜#
Indique que la réponse doit être mise en cache en tant que cache public et privé.


private

indique que tout ou partie du message de réponse est uniquement destiné à un certain utilisateur, désactivez donc la mise en cache en tant que mise en cache publique.


Symfony définit de manière conservatrice chaque réponse comme privée. Afin de profiter d'un cache partagé (comme un proxy inverse Symfony), la réponse doit être explicitement définie sur public.

Méthode sécurisée

La mise en cache HTTP ne fonctionne que sous les méthodes HTTP "sûres" (telles que GET ou HEAD). La soi-disant sécurité signifie que vous ne pouvez jamais modifier l'état du programme sur le serveur lorsque vous fournissez des services aux requêtes (tels que la journalisation, le traitement des informations du cache, etc.). Cela conduit à deux conclusions extrêmement convaincantes et importantes :

  • Vous ne devez jamais changer l'état du programme en réponse à une requête GET ou HEAD. Même si vous n'utilisez pas le cache de passerelle, l'essence du cache proxy est que toute requête GET ou HEAD peut ou non atteindre votre serveur

  • Don't ; attendez-vous aux méthodes PUT, POST ou DELETE pour la mise en cache. Ces méthodes sont destinées à être utilisées lorsque l'état de votre application change (comme la suppression d'un article de blog). Les mettre en cache empêchera des requêtes spécifiques d’atteindre ou de modifier votre programme.

Règles de mise en cache et paramètres par défaut

HTTP1.1 permet la mise en cache de tout par défaut, sauf indication contraire L'en-tête Cache-Control est spécifié. En pratique, la plupart des caches ne font rien lorsqu'une requête contient un cookie, lorsqu'un en-tête d'autorisation est inclus, lorsqu'une méthode non sécurisée est utilisée (telle que PUT, POST ou DELETE) ou lorsque la réponse a un code d'état de redirection.

Cache-Control头。实践中,多数缓存在请求中包含cookie时、包含authorization头时、使用了一个非安全方法时(比如PUT、POST或DELETE)或当响应有一个重定向状态码时,什么也不做。

当开发者在响应头中什么也没设置时,Symfony依据以下规则,自动设置了有意义的而且是偏保守的Cache-Header头。

  • 如果没有缓存头信息被定义(Cache-ControlExpiresETagLast-Modified),Cache-Control将被设为no-cache,代表响应将不被缓存;

  • 如果Cache-Control是空(但是另外一个缓存头有被设置),其值将被设为private, must-revalidateLorsque le développeur ne définit rien dans l'en-tête de réponse, Symfony définit automatiquement un en-tête Cache-Header significatif et conservateur selon les règles suivantes.

    #🎜🎜##🎜🎜##🎜🎜#Si aucune information d'en-tête de cache n'est définie (Cache-Control, Expires, ETag code> ou Last-Modified), Cache-Control sera défini sur no-cache, ce qui signifie que la réponse ne sera pas mise en cache ; #🎜🎜 ##🎜🎜##🎜🎜##🎜🎜#Si Cache-Control est vide (mais qu'un autre en-tête de cache est défini), sa valeur sera définie sur private, doit- revalider;#🎜🎜#
  • Mais si au moins une directive Cache-Control est définie et qu'aucune directive public ou private n'est explicitement ajoutée, Symfony ajoutera automatiquement < directives code>private (sauf lorsque s-maxage est défini) Cache-Control指令被设置,而且没有publicprivate指令被显式添加的话,Symfony会自动添加private指令(除了当s-maxage被设置时)

HTTP Expiration,Validation和Invalidation 

HTTP协议定义了两种缓存模型:

  • 利用expiration model(过期模型),通过包容Cache-Control头和/或Expires头,即可直接指定一个响应应该被认为“新鲜”的时长。缓存能够理解过期时间,不再制造相同请求,直到该缓存版本抵达过期时间,而且变得“不新鲜(stale)”。

  • 当页面是真动态时(展现层经常改变),则validation model(验证模型)的使用就十分有必要。利用这个模型,缓存把响应存储起来,但会在每次请求时向服务器“提问”——是否缓存了的响应仍然有效?程序使用了一个独立的响应识别器(即Etag头)和/或一个时间戳(即Last-Modified

  • Expiration HTTP, validation et invalidation

Mais il existe un 🎜HTTP Bis🎜 en cours pour écraser la RFC 2616. Il ne décrit pas la nouvelle version de HTTP, mais plutôt un nettoyage du protocole HTTP d'origine. L'organisation du document a également été améliorée avec la division du protocole HTTP en sept parties ; chaque partie concernant la mise en cache HTTP peut être trouvée dans deux chapitres distincts (🎜P4 - Requêtes conditionnelles🎜 et 🎜P6 - Mise en cache : caches du navigateur et intermédiaires🎜). 🎜🎜En tant que développeur Web, vous êtes 🎜fortement invité par notre équipe officielle Symfony🎜 à vous renseigner sur le protocole HTTP. Elle est si claire et si puissante que, même 10 ans après sa création, la spécification HTTP n'a pas de prix. Nous vous rappelons de ne pas ignorer l'apparence de ces accords : leur contenu est des centaines de milliers de fois plus beau que leur couverture. 🎜🎜🎜

Expiration (expiration)

le modèle d'expiration est le plus efficace et le plus direct des deux modèles de mise en cache, il doit donc être utilisé autant que possible. Lorsqu'une réponse est mise en cache via l'expiration, le cache enregistre la réponse et la renvoie directement avant l'expiration, sans avoir à lancer le programme.

Le modèle d'expiration peut être implémenté via l'un des deux en-têtes HTTP presque identiques suivants : Expires ou Cache-Control. ExpiresCache-Control

使用Expires头控制过期 

根据HTTP specification,“Expires头字段将在response被认为是stale之后给出date/time。”。这里的Expires头可以被设为Response方法:setExpires()。它使用DateTime实例作为参数:

1

该响应的HTTP头信息类似这种:

Cache-Control: max-age=600, s-maxage=600

setExpires()方法将自动转换日期为GMT时区,因为这是HTTP specification的要求。

注意,在HTTP 1.1版之前,并不需要原始服务器来发送Date头。因此,缓存(比如浏览器的)就需要本地时钟来评估Expires头,进而令缓存周期的计算因时间倾斜而变得脆弱不堪。另外一个Expires头限制是,正如HTTP协议中所描述的,“HTTP/1.1 不得发送Expires的日期超过一年。”

使用Cache-Control头控制过期 

因为Expires头的限制,多数情况下,你应该使用Cache-Control头来替代。记得,Cache-Control头被用于多种不同的缓存指令。例如,max-ages-maxage。第一个用于全部缓存,而第二个仅在共享缓存时用到。

// Marks the Response stale 标记响应过期$response->expire(); 
// Force the response to return a proper 304 response with no content
// 强制响应返回一个没有内容的恰当的304响应$response->setNotModified();

Cache-Control

Utilisez l'en-tête Expires pour contrôler l'expiration
Selon la spécification HTTP, le champ d'en-tête "Expires sera prise en compte dans la réponse est la date/heure indiquée après le périmé." L'en-tête Expires ici peut être défini sur la méthode Response : setExpires(). Il utilise une instance DateTime comme paramètre :
// Set cache settings in one call$response->setCache(array(
    'etag'          => $etag,
    'last_modified' => $date,
    'max_age'       => 10,
    's_maxage'      => 10,
    'public'        => true,
    // 'private'    => true,
    ));
Les informations d'en-tête HTTP de la réponse sont similaires à ceci : Notez qu'avant la version HTTP 1.1, le serveur d'origine n'était pas obligé d'envoyer l'en-tête Date. Par conséquent, les caches (tels que les navigateurs) nécessitent une horloge locale pour évaluer l'en-tête Expires, ce qui rend les calculs de période de cache vulnérables aux décalages temporels. Une autre restriction de l'en-tête Expires est que, comme décrit dans le protocole HTTP, "HTTP/1.1 NE DOIT PAS envoyer de Expires avec une date antérieure à un an." -Control header Contrôler l'expiration rrreeeCache-ControlL'en-tête est généralement au format suivant (mais parfois il y a d'autres instructions) :
rrreee
La méthode setExpires() convertira automatiquement le date au fuseau horaire GMT, car il s'agit d'une exigence de la spécification HTTP.
En raison des limitations de l'en-tête Expires, dans la plupart des cas, vous devriez utilisez plutôt l'en-tête Cache-Control. N'oubliez pas que l'en-tête Cache-Control est utilisé pour diverses directives de mise en cache. Par exemple, max-age et s-maxage. Le premier est utilisé pour tous les caches, tandis que le second n'est utilisé que lorsque le cache est partagé.
🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜🎜rrreee🎜🎜🎜🎜🎜

Expiration et Validation (Expiration et Validation)

Bien sûr, vous pouvez utiliser la validation et l'expiration en même temps pour la même Réponse. Étant donné que les avantages de l’expiration l’emportent sur la validation, vous pouvez facilement bénéficier du meilleur des deux mondes. Autrement dit, en utilisant ensemble l'expiration et la validation, vous pouvez demander au cache de servir le contenu déjà mis en cache, tout en vérifiant également à certains intervalles (expiration) pour confirmer que le contenu mis en cache est toujours valide. Response同时使用validation和expiration。因为expiration的优势大过validation,你能很容易地从两个世界中好的一面受益。也就是说,同时使用过期和验证,你可以命令缓存来服务于已缓存的内容,同时还能在某些区间(expiration)向后检查以确认缓存内容仍然有效。

你也可以通过annotation来为expiration和validation去定义HTTP缓存头。参考FrameworkExtraBundle文档。

更多Response方法 

Response类提供了很多方法以应对缓存。下面是几个特别有用的:

rrreee

另外,多数与缓存相关的HTTP头可以单独使用setCache()