HTTP缓存
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
HTTP缓存
富web应用程序的本质意味着它们是动态的。无论您的应用程序有多高效,每个请求都会包含比提供静态文件更多的开销。
对于大多数Web应用程序来说,这是可以接受的。ob娱乐下载Symfony2的速度非常快,除非您正在做一些非常繁重的工作,否则每个请求都将很快返回,而不会对服务器造成太大压力。
但是随着站点的增长,这种开销可能会成为一个问题。通常对每个请求执行的处理应该只执行一次。这正是缓存要实现的目标。
在巨人的肩膀上奔跑
提高应用程序性能的最有效方法是缓存页面的全部输出,然后在每个后续请求上完全绕过应用程序。当然,对于高度动态的网站来说,这并不总是可行的,不是吗?在本章中,您将了解Symfony2缓存系统是如何工作的,以及为什么这是可ob娱乐下载能的最佳方法。
Symfob娱乐下载ony2缓存系统是不同的,因为它依赖于HTTP缓存的简单性和功能HTTP规范.Symfony2没有重新发明缓存方法,而是采用了定义Web上基本通信的标准。ob娱乐下载一旦理解了基本的HTTP验证和过期缓存模型,就可以掌握Symfony2缓存系统了。ob娱乐下载
为了学习如何使用Symfony2进行缓存,这个主题分为四个步骤:ob娱乐下载
- 一个网关缓存或反向代理,是位于应用程序前面的独立层。反向代理缓存从应用程序返回的响应,并在请求到达应用程序之前使用缓存的响应应答请求。ob娱乐下载Symfony2提供了自己的反向代理,但是可以使用任何反向代理。
- HTTP缓存头文件用于与网关缓存和应用程序与客户端之间的任何其他缓存通信。ob娱乐下载Symfony2为与缓存头交互提供了合理的默认值和强大的接口。
- HTTP过期和验证这两个模型是否用于确定缓存的内容是否正确新鲜的(可以从缓存中重用)或不新鲜的(应该由应用程序重新生成)。
- 边边包含(ESI)允许使用HTTP缓存独立地缓存页面片段(甚至嵌套片段)。使用ESI,您甚至可以缓存整个页面60分钟,但嵌入式侧边栏只能缓存5分钟。
由于使用HTTP进行缓存并不是Symfony独有的,因此已经有很多关于这个主题的ob娱乐下载文章。如果您不熟悉HTTP缓存,请参阅Ryan Tomayko的文章缓存的作用是高度推荐。另一个深度资源是Mark Nottingham的缓存教程.
使用网关缓存进行缓存
使用HTTP进行缓存时,缓存它与应用程序完全分离,位于应用程序和发出请求的客户端之间。
缓存的工作是接受来自客户机的请求并将它们传递回应用程序。缓存还将从应用程序接收响应,并将它们转发给客户端。缓存是客户端和应用程序之间请求-响应通信的“中间人”。
在此过程中,缓存将存储每个被视为“可缓存”的响应(参见HTTP缓存).如果再次请求相同的资源,缓存将缓存的响应发送到客户机,完全忽略应用程序。
这种类型的缓存被称为HTTP网关缓存,存在许多缓存,例如清漆,鱿鱼在反向代理模式,以及Symfonyob娱乐下载2反向代理。
缓存类型
但是网关缓存并不是唯一的缓存类型。事实上,你的应用程序发送的HTTP缓存头被多达三种不同类型的缓存消耗和解释:
- 浏览器缓存每个浏览器都有自己的本地缓存,主要用于当你点击“返回”或图像和其他资产时。浏览器缓存是私人缓存作为缓存的资源不与其他任何人共享;
- 代理缓存:代理共享尽可能多的人躲在一个人后面。它通常由大公司和isp安装,以减少延迟和网络流量;
- 网关缓存:就像代理一样,它也是共享缓存,但在服务器端。由网络管理员安装,使网站更具可扩展性,可靠性和性能。
提示
网关缓存有时被称为反向代理缓存、代理缓存,甚至HTTP加速器。
请注意
的意义私人与共享当讨论缓存包含特定于一个用户的内容(例如帐户信息)的响应时,缓存将变得更加明显。
应用程序的每个响应都可能使用前两种缓存类型中的一种或两种。这些缓存不在您的控制范围内,但要遵循响应中设置的HTTP缓存方向。
ob娱乐下载Symfony2反向代理
ob娱乐下载Symfony2带有一个用PHP编写的反向代理(也称为网关缓存)。启用它,应用程序的可缓存响应将立即开始缓存。安装它也很简单。每个新的Symfoob娱乐下载ny2应用程序都带有一个预配置的缓存内核(AppCache
),它封装了默认的(AppKernel
).缓存内核是反向代理。
为了启用缓存,修改前端控制器的代码以使用缓存内核:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /网络/ app.phprequire_once__DIR__.“/ . . / app / bootstrap.php.cache”;require_once__DIR__.“/ . . / app / AppKernel.php”;require_once__DIR__.“/ . . / app / AppCache.php”;使用ob娱乐下载\组件\HttpFoundation\请求;$内核=新AppKernel (“刺激”,假);$内核->loadClassCache ();//将默认的AppKernel包装成AppCache内核$内核=新AppCache ($内核);$请求=请求::createFromGlobals ();$响应=$内核->处理($请求);$响应->send ();$内核->终止($请求,$响应);
缓存内核将立即充当反向代理——缓存来自应用程序的响应并将它们返回给客户端。
提示
缓存内核有一个特殊的getLog ()
方法,该方法返回表示缓存层中发生的事情的字符串。在开发环境中,使用它来调试和验证您的缓存策略:
1
error_log ($内核->getLog ());
的AppCache
对象具有合理的默认配置,但是可以通过覆盖所设置的一组选项对其进行微调getOptions ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / app / AppCache.php使用ob娱乐下载\包\FrameworkBundle\HttpCache\HttpCache;类AppCache扩展HttpCache{受保护的函数getOptions(){返回数组(“调试”= >假,“default_ttl”= >0,“private_headers”= >数组(“授权”,“饼干”),“allow_reload”= >假,“allow_revalidate”= >假,“stale_while_revalidate”= >2,“stale_if_error”= >60,);}}
提示
除非在getOptions ()
,调试
选项将自动设置为被包装的调试值AppKernel
.
以下是主要选项的列表:
default_ttl
:当响应中没有提供显式的新鲜度信息时,缓存条目应该被认为是新鲜的秒数。显式的cache - control
或到期
头文件覆盖这个值(默认值:0
);private_headers
:触发“private”的请求头集cache - control
未显式声明响应是否为的响应上的行为公共
或私人
通过一个cache - control
指令。(默认值:授权
而且饼干
);allow_reload
:指定客户端是否可以通过包含cache - control
请求中的"no-cache"指令。设置为真正的
符合RFC 2616(默认:假
);allow_revalidate
:指定客户端是否可以通过包含cache - control
"max-age=0"指令。设置为真正的
符合RFC 2616(默认值:false);stale_while_revalidate
:指定默认的秒数(响应TTL精度为秒,粒度为秒),在此期间缓存可以立即返回一个过时的响应,同时在后台重新验证它(默认:2
);属性将覆盖此设置stale-while-revalidate
HTTPcache - control
扩展(参见RFC 5861);stale_if_error
:指定默认的秒数(粒度为秒),在此期间,当遇到错误时,缓存可以提供过时的响应(默认:60
).属性将覆盖此设置stale-if-error
HTTPcache - control
扩展(参见RFC 5861)。
如果调试
是真正的
, ob娱乐下载Symfony2自动添加X-ob娱乐下载Symfony-Cache
响应头,其中包含有关缓存命中和未命中的有用信息。
请注意
Symfony2反向代理的性能与应用程序的复杂ob娱乐下载性无关。这是因为应用程序内核仅在需要将请求转发给它时才会启动。
HTTP缓存简介
为了利用可用的缓存层,您的应用程序必须能够交流哪些响应是可缓存的,以及管理缓存何时/如何失效的规则。这是通过在响应上设置HTTP缓存头来实现的。
提示
请记住,“HTTP”只不过是web客户端(例如浏览器)和web服务器用来相互通信的语言(一种简单的文本语言)。HTTP缓存是该语言的一部分,它允许客户端和服务器交换与缓存相关的信息。
HTTP指定了下面的四个响应缓存头:
cache - control
到期
ETag
last - modified
最重要和最通用的头文件是cache - control
头,它实际上是各种缓存信息的集合。
请注意
中将详细解释每个头文件HTTP缓存部分。
缓存控制头
的cache - control
头是唯一的,因为它包含的不是一个,而是多个关于响应缓存性的信息。每条信息用逗号分隔:
Cache-Control: private, max-age=0,必须重新验证
Cache-Control: max-age=3600,必须重新验证
ob娱乐下载的抽象cache - control
头,使其创建更易于管理:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……使用ob娱乐下载\组件\HttpFoundation\响应;$响应=新反应();//将响应标记为public或private$响应->setPublic ();$响应->setPrivate ();//设置私有或共享的最大年龄$响应->setMaxAge (600);$响应->setSharedMaxAge (600);//设置一个自定义Cache-Control指令$响应->头->addCacheControlDirective (“must-revalidate”,真正的);
公众回应与私人回应
网关和代理缓存都被认为是“共享”缓存,因为缓存的内容由多个用户共享。如果共享缓存错误地存储了特定于用户的响应,那么稍后可能会将其返回给任意数量的不同用户。想象一下,如果您的帐户信息被缓存,然后返回给每个请求他们的帐户页面的后续用户!
为了处理这种情况,每个响应都可以设置为public或private:
- 公共:表示响应可以被私有缓存和共享缓存缓存;
- 私人:表示响应消息的全部或部分用于单个用户,不能由共享缓存缓存。
ob娱乐下载Symfony保守地将每个响应默认为私有。为了利用共享缓存(如Symfony2反向代理),需要显式地将响应设置为公共。ob娱乐下载
安全的方法
HTTP缓存只适用于“安全”的HTTP方法(如GET和HEAD)。安全意味着在处理请求时永远不会更改应用程序在服务器上的状态(当然可以记录信息、缓存数据等)。这有两个非常合理的结果:
- 你应该从来没有在响应GET或HEAD请求时改变应用程序的状态。即使您不使用网关缓存,代理缓存的存在意味着任何GET或HEAD请求可能会或可能不会真正到达您的服务器;
- 不要期望PUT, POST或DELETE方法进行缓存。这些方法用于改变应用程序的状态(例如删除一篇博客文章)。缓存它们可以防止某些请求攻击和改变应用程序。
缓存规则和默认值
HTTP 1.1默认情况下允许缓存任何内容,除非有显式的缓存cache - control
头。在实践中,当请求有cookie、授权头、使用非安全方法(即PUT、POST、DELETE)或响应有重定向状态码时,大多数缓存什么都不做。
ob娱乐下载Symfony2自动设置明智和保守cache - control
头,当开发人员按照以下规则设置为none时:
- 如果没有定义缓存头(
cache - control
,到期
,ETag
或last - modified
),cache - control
设置为no - cache
,意味着响应将不会被缓存; - 如果
cache - control
为空(但存在另一个缓存头),其值设置为私人的,must-revalidate
; - 但如果至少有一个
cache - control
指令是设定的,没有“公共”或私人
指令已经显式添加,Symfony2添加ob娱乐下载私人
自动指示(除非s-maxage
设置)。
HTTP过期和验证
HTTP规范定义了两种缓存模型:
- 与失效模式,您只需指定响应应该被认为是“新鲜”的时间
cache - control
和/或一个到期
头。了解过期的缓存将不会发出相同的请求,直到缓存的版本达到过期时间并变得“陈旧”; - 当页面是真正动态的(即它们的表示经常变化),则验证模型常常是必要的。在这个模型中,缓存存储响应,但在每次请求时询问服务器缓存的响应是否仍然有效。应用程序使用唯一的响应标识符
Etag
标头)和/或时间戳last - modified
头)来检查页面在缓存后是否发生了变化。
这两个模型的目标都是通过依赖缓存来存储和返回“新鲜”响应,从而避免两次生成相同的响应。
过期
过期模型是两种缓存模型中更有效、更直接的,应该尽可能使用它。当响应被缓存到过期时,缓存将存储响应并直接返回它,而不影响应用程序,直到它过期。
过期模型可以使用两个几乎相同的HTTP头中的一个来完成:到期
或cache - control
.
到期时使用到期
头
根据HTTP规范,“the到期
报头字段给出的日期/时间之后,响应被认为是陈旧的。的到期
属性可以设置setExpires ()
响应
方法。它需要DateTime
Instance作为参数:
1 2 3 4
$日期=新DateTime ();$日期->修改(+ 600秒的);$响应->setExpires ($日期);
结果的HTTP头看起来像这样:
1
截止日期:2011年3月1日星期四16:00:00 GMT
请注意
的setExpires ()
方法自动将日期转换为规范要求的GMT时区。
注意,在1.1之前的HTTP版本中,源服务器不需要发送日期
头。因此缓存(例如浏览器)可能需要依赖于他的本地时钟来计算到期
报头使寿命计算容易受到时钟倾斜。另一个限制到期
该规范声明“HTTP/1.1服务器不应该发送到期
日期超过一年以后。”
到期时使用cache - control
头
因为到期
标题的限制,大多数时候,你应该使用cache - control
头。回想一下cache - control
头文件用于指定许多不同的缓存指令。对于过期,有两个指令,信息
而且s-maxage
.第一个选项供所有缓存使用,而第二个选项仅供共享缓存使用:
1 2 3 4 5 6
//设置响应后的秒数//应该不再被认为是新鲜的$响应->setMaxAge (600);//与上面相同,但仅用于共享缓存$响应->setSharedMaxAge (600);
的cache - control
Header将采用以下格式(它可能有额外的指令):
1
Cache-Control: max-age=600, s-maxage=600
验证
当需要在对底层数据进行更改后立即更新资源时,过期模型就不适用了。使用过期模型,应用程序不会被要求返回更新后的响应,直到缓存最终失效。
验证模型解决了这个问题。在此模型下,缓存继续存储响应。不同之处在于,对于每个请求,缓存都会询问应用程序缓存的响应是否仍然有效。如果缓存是仍然有效,您的应用程序应该返回一个304状态代码,没有内容。这将告诉缓存可以返回缓存的响应。
在此模型下,您主要节省了带宽,因为表示不会向同一个客户机发送两次(而是发送一个304响应)。但是,如果您仔细设计应用程序,您可能能够获得发送304响应所需的最少数据,并节省CPU(参见下面的实现示例)。
提示
304状态代码表示“未修改”。这很重要,因为有了这个状态代码,响应就会这样做不包含被请求的实际内容。相反,响应只是一组轻量级的方向,告诉缓存它应该使用它存储的版本。
和过期一样,有两种不同的HTTP头可以用来实现验证模型:ETag
而且last - modified
.
使用ETag
头
的ETag
标头是一个字符串标头(称为“entity-tag”),唯一标识目标资源的一种表示。它完全由您的应用程序生成和设置,因此您可以判断,例如,如果/对
由缓存存储的资源与应用程序将返回的内容是最新的。一个ETag
类似于指纹,用于快速比较资源的两个不同版本是否等效。就像指纹一样ETag
必须在同一资源的所有表示形式中惟一。
要查看一个简单的实现,生成ETag作为内容的md5:
1 2 3 4 5 6 7 8 9
公共函数indexAction(){$响应=$这->呈现(“MyBundle:主要:index.html.twig”);$响应->setETag (md5 ($响应->getContent ()));$响应->setPublic ();//确保响应是public/cacheable$响应->isNotModified ($这->getRequest ());返回$响应;}
的isNotModified ()方法比较ETag
随附请求
有一个设置在响应
.如果两者匹配,则该方法自动设置响应
状态代码是304。
这个算法非常简单,而且非常通用,但是您需要创建整个算法响应
才能计算ETag,这是次优的。换句话说,它节省了带宽,但没有节省CPU周期。
在HTTP缓存部分,您将看到如何更智能地使用验证来确定缓存的有效性,而不需要做这么多工作。
提示
ob娱乐下载Symfony2还通过传递支持弱ETags真正的
的第二个参数setETag ()方法。
使用last - modified
头
的last - modified
报头是验证的第二种形式。根据HTTP规范,“thelast - modified
报头字段指示原始服务器认为表示最后修改的日期和时间。”换句话说,应用程序根据缓存响应后缓存的内容是否已经更新来决定缓存的内容是否已经更新。
属性的值,可以使用计算资源表示所需要的所有对象的最新更新日期last - modified
头的值:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
公共函数showAction($articleSlug){/ /……$articleDate=新\ DateTime ($文章->getUpdatedAt ());$authorDate=新\ DateTime ($作者->getUpdatedAt ());$日期=$authorDate>$articleDate?$authorDate:$articleDate;$响应->setLastModified ($日期);//设置响应为public。否则默认为私有。$响应->setPublic ();如果($响应->isNotModified ($这->getRequest ())) {返回$响应;}/ /……做更多的工作来填充响应的完整内容返回$响应;}
的isNotModified ()方法比较if - modified - since
请求发送的头last - modified
头设置在响应上。如果它们相等,则响应
将被设置为304状态码。
请注意
的if - modified - since
请求头等于last - modified
为特定资源发送给客户端的最后响应的报头。这是客户端和服务器相互通信并决定自缓存以来资源是否已更新的方式。
使用验证优化代码
任何缓存策略的主要目标都是减轻应用程序的负载。换句话说,在应用程序中返回304响应的操作越少越好。的回应::isNotModified ()
方法通过公开一个简单而有效的模式来做到这一点:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
使用ob娱乐下载\组件\HttpFoundation\响应;公共函数showAction($articleSlug){//获取要计算的最小信息// ETag或Last-Modified值//(基于请求,数据从//数据库或键值存储)$文章=……;//创建一个带有ETag和/或Last-Modified报头的响应$响应=新反应();$响应->setETag ($文章->computeETag ());$响应->setLastModified ($文章->getPublishedAt ());//设置响应为public。否则默认为私有。$响应->setPublic ();//检查给定请求的响应是否被修改如果($响应->isNotModified ($这->getRequest ())) {//立即返回304响应返回$响应;}其他的{//在这里做更多的工作——比如检索更多的数据$评论=……;//或者用你已经开始的$response来呈现一个模板返回$这->呈现(“MyBundle: MyController: article.html.twig”,数组(“文章”= >$文章,“评论”= >$评论),$响应);}}
当响应
不是修改过的吗isNotModified ()
自动将响应状态代码设置为304
,删除内容,并删除一些必须不显示的标题304
反应(见setNotModified ()).
改变回应
到目前为止,我们假设每个URI都只有目标资源的一种表示形式。默认情况下,HTTP缓存是通过使用资源的URI作为缓存键完成的。如果两个人请求一个可缓存资源的相同URI,第二个人将收到缓存的版本。
有时这还不够,需要基于一个或多个请求头值缓存相同URI的不同版本。例如,如果在客户端支持压缩页面的情况下压缩页面,那么任何给定的URI都有两种表示:一种是客户端支持压缩,另一种是不支持压缩。这个确定是由值来完成的接受编码
请求头。
在这种情况下,您需要缓存存储特定URI响应的压缩版本和未压缩版本,并根据请求返回它们接受编码
价值。这是通过使用不同
响应头,这是一个以逗号分隔的不同头的列表,其值触发所请求资源的不同表示:
1
变体:Accept-Encoding, User-Agent
提示
这个特殊的不同
的值将缓存每个资源的不同版本接受编码
而且用户代理
请求头。
的响应
对象提供了一个干净的接口来管理不同
标题:
1 2 3 4 5
//设置一个可变头$响应->setVary (“接受编码”);//设置多个vary头$响应->setVary (数组(“接受编码”,“用户代理”));
的setVary ()
方法接受响应不同的标题名或标题名数组。
过期和验证
当然,您可以同时使用验证和过期响应
.由于过期胜过验证,您可以轻松地从两个世界的优点中受益。换句话说,通过使用过期和验证,您可以指示缓存提供缓存的内容,同时以一定的时间间隔(过期)进行检查,以验证内容是否仍然有效。
更多响应方法
Response类提供了更多与缓存相关的方法。以下是最有用的方法:
1 2 3 4 5
//标记响应过期$响应->到期();//强制返回正确的304响应,不包含任何内容$响应->setNotModified ();
此外,大多数与缓存相关的HTTP头可以通过单个setCache ()方法:
1 2 3 4 5 6 7 8 9
//一次调用设置缓存$响应->setCache (数组(“etag”= >$etag,“last_modified”= >$日期,“max_age”= >10,“s_maxage”= >10,“公共”= >真正的,// 'private' => true,));
使用边缘包含
网关缓存是一种让你的网站表现更好的好方法。但是它们有一个限制:它们只能缓存整个页面。如果您不能缓存整个页面,或者页面的某些部分具有“更多”动态部分,那么您就不走运了。幸运的是,Symfony2ob娱乐下载为这些情况提供了一种解决方案,它基于一种名为应急服务国际公司,或边边包含。Akamaï在大约10年前编写了这个规范,它允许页面的特定部分使用与主页不同的缓存策略。
ESI规范描述了可以嵌入到页面中以与网关缓存通信的标记。Symfony2中只实现了一个标记,ob娱乐下载包括
,因为这是Akamaï context之外唯一有用的:
1 2 3 4 5 6 7 8 9 10 11
<!文档类型超文本标记语言><超文本标记语言><身体><!——……一些内容——><!——在这里嵌入另一个页面的内容——><应急服务国际公司:包括src=“http://..”。/><!——……更多内容——>身体>超文本标记语言>
请注意
从示例中可以注意到,每个ESI标记都有一个完全限定的URL。ESI标记表示可以通过给定URL获取的页面片段。
当处理请求时,网关缓存从它的缓存中获取整个页面,或者从后端应用程序请求它。如果响应包含一个或多个ESI标记,则以相同的方式处理它们。换句话说,网关缓存要么从它的缓存中检索包含的页面片段,要么再次从后端应用程序请求页面片段。在解析完所有ESI标记后,网关缓存将每个ESI标记合并到主页中,并将最终内容发送到客户机。
所有这些都在网关缓存级别透明地发生(即在应用程序之外)。正如您将看到的,如果您选择利用ESI标记,Symfony2使得包含它们的过程几乎毫不费力。ob娱乐下载
在Symfony2中使用Eob娱乐下载SI
首先,要使用ESI,请确保在应用程序配置中启用它:
- YAML
- XML
- PHP
1 2 3 4
# app / config / config.yml框架:#……应急服务国际公司:{启用:真正的}
现在,假设您有一个相对静态的页面,除了在内容底部有一个新闻标记。欧宝平台是合法的吗使用ESI,您可以独立于页面的其余部分缓存新闻触发器。欧宝平台是合法的吗
1 2 3 4 5 6 7 8
公共函数indexAction(){$响应=$这->呈现(“MyBundle: MyController: index.html.twig”);//设置共享的最大年龄-这也将响应标记为公共$响应->setSharedMaxAge (600);返回$响应;}
在本例中,全页缓存的生存期为10分钟。接下来,通过嵌入一个动作将新闻标记包欧宝平台是合法的吗含在模板中。这是通过渲染
辅助(见创建和使用模板有关详情)。
由于嵌入的内容来自另一个页面(或控制器),Symfony2使用标准ob娱乐下载渲染
帮助配置ESI标签:
- 嫩枝
- PHP
1
{%渲染Url ('latest欧宝平台是合法的吗_news', {'马克斯': 5}), {'standalone': true} %}
请注意
自Symfoob娱乐下载ny 2.0.20/2.1.5以来,树枝渲染
标签现在接受一个绝对url,而不是控制器逻辑路径。这修复了一个重要的安全问题(cve - 2012 - 6431)在官方博客上报道。如果您的应用程序使用较旧的Symfony版本或仍然使用以前的版本ob娱乐下载渲染
标签语法,您应该尽快升级。
的渲染
标记将绝对url传递给嵌入的操作。这意味着你需要定义一个到你嵌入的控制器的新路由:
1 2 3 4 5
# app / config / routing.ymllatest_欧宝平台是合法的吗news:模式:/ esi /最新消息/欧宝平台是合法的吗{马克斯}默认值:{_controller:Acme欧宝平台是合法的吗NewsBundle:新闻:新闻}要求:{马克斯:\ d +}
提示
最好的做法是将所有ESI url挂载在一个前缀上(例如。/应急服务国际公司
)你自己选择。这有两个主要优势。首先,它简化了ESI url的管理,因为您可以轻松地识别用于ESI的路由。其次,它简化了安全管理,因为保护所有以相同前缀开头的url比保护每个单独的url更容易。有关保护ESI url的更多详细信息,请参阅上面的说明。
通过设置独立的
来真正的
在渲染
Twig标记,您告诉Symfony2该ob娱乐下载操作应该呈现为ESI标记。您可能想知道为什么要使用帮助器,而不是自己编写ESI标记。这是因为即使没有安装网关缓存,使用helper也可以使应用程序正常工作。
当独立的时候假
(默认值),Symfony2在ob娱乐下载向客户端发送响应之前将包含的页面内容合并到主页面中。但是当独立的时候真正的
,而且如果Sob娱乐下载ymfony2检测到它正在与支持ESI的网关缓存通信,它将生成一个ESI include标记。但是,如果没有网关缓存,或者不支持ESI, Symfony2将只是将包含的页面内容合并到主页面中,就像设置为独立时那样ob娱乐下载假
.
请注意
ob娱乐下载Symfony2通过Symfony2反向代理开箱即用的另一个Akamaï规范来检测网关缓存是否支持ESI。
嵌入式操作现在可以指定自己的缓存规则,完全独立于母版页。
1 2 3 4 5 6
公共函数欧宝平台是合法的吗newsAction($马克斯){/ /……$响应->setSharedMaxAge (60);}
使用ESI,整个页面缓存的有效期为600秒,但新闻组件缓存的有效期仅为60秒。欧宝平台是合法的吗
这种缓存策略的一大优点是,您可以根据需要使应用程序动态,同时尽可能少地访问应用程序。
请注意
一旦开始使用ESI,请记住始终使用s-maxage
指令而不是信息
.由于浏览器只接收到聚合的资源,所以它不知道子组件,因此它将服从信息
指令并缓存整个页面。这是你不想要的。
的渲染
Helper支持其他两个有用的选项:
alt
:用作alt
属性,该属性允许您指定要使用的替代URLsrc
找不到;ignore_errors
:如果设置为true,则anonerror
属性将添加到ESI,值为继续
这表明,在发生故障时,网关缓存将简单地无声地删除ESI标记。
缓存失效
“计算机科学中只有两件难事:缓存失效和命名。”——菲尔Karlton
您不应该需要使缓存数据失效,因为失效在HTTP缓存模型中已经被考虑在内了。如果你使用验证,你永远不需要根据定义使任何东西无效;如果您使用expiration并且需要使资源失效,这意味着您将过期日期设置得太远了。
请注意
由于无效是特定于每种类型的反向代理的主题,如果您不担心无效,则可以在反向代理之间切换,而无需更改应用程序代码中的任何内容。
实际上,所有反向代理都提供了清除缓存数据的方法,但您应该尽可能避免使用它们。最标准的方法是通过特殊请求来清除给定URL的缓存清洗
HTTP方法。
下面介绍如何配置Symfony2反向代理以支持ob娱乐下载清洗
HTTP方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / app / AppCache.php/ /……使用ob娱乐下载\包\FrameworkBundle\HttpCache\HttpCache;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;类AppCache扩展HttpCache{受保护的函数无效(请求$请求,$抓= false){如果(“清除”= = !$请求->getMethod ()) {返回父::无效($请求,$抓);}$响应=新反应();如果(!$这->getStore ()->清洗($请求->getUri ())) {$响应->setStatusCode (404,“不清除”);}其他的{$响应->setStatusCode (200,“清除”);}返回$响应;}}
谨慎
你必须保护清洗
HTTP方法以某种方式避免随机的人清除您的缓存数据。
总结
ob娱乐下载Symfony2的设计遵循了经过验证的规则:HTTP。缓存也不例外。掌握Symfony2缓存系统ob娱乐下载意味着熟悉HTTP缓存模型并有效地使用它们。这意味着,您不仅可以依赖Symfony2文档和代码示例,还可以访问与HTTP缓存和网关缓ob娱乐下载存(如Varnis欧宝官网下载apph)相关的大量知识。