HTTP缓存

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

HTTP缓存

丰富的web应用程序的本质意味着他们的动态。无论多么高效的应用程序,每个请求总是含有更多的开销比静态文件。

对大多数Web应用程序中,这很好。欧宝娱乐app下载地址Symfony是闪电快,除非你是做一些严肃的繁重,每个请求很快会回来没有把太多的压力在你的服务器上。

但是随着你的站点,开销就会变成一个问题。通常对每个请求执行的处理应该做一次。这正是缓存旨在完成。

缓存在巨人的肩膀上

最有效的方法来提高性能的应用程序缓存页面的全部输出,然后绕过每个后续请求的应用程序完全。当然,这并不总是可能的高度动态的网站,还是?在这一章,你会看到Symfony缓存系统是如何工作的,为什么这是最好的方欧宝娱乐app下载地址法。

Symf欧宝娱乐app下载地址ony缓存系统是不同的,因为它依赖于简单和HTTP缓存中定义的HTTP规范。而不是重新缓存方法,Symfony拥抱的标准定义了基本的沟通在网上。欧宝娱乐app下载地址一旦你理解了基本的HTTP验证和过期的缓存模型,你会准备主Symfony缓存系统。欧宝娱乐app下载地址

为了学习如何缓存Symfony,主题是覆盖着四个步骤:欧宝娱乐app下载地址

  1. 一个网关缓存反向代理,是一个独立的应用程序层,坐在前面。反向代理缓存响应,他们从您的应用程序和答案回来请求与缓存的响应之前触及您的应用程序。欧宝娱乐app下载地址Symfony提供了自己的反向代理,但任何可以使用反向代理。
  2. HTTP缓存头与网关通信使用缓存和其他缓存应用程序和客户端之间。欧宝娱乐app下载地址Symfony提供了合理的默认值和一个强大的交互接口缓存头。
  3. HTTP过期和验证两个模型用于确定缓存的内容是什么新鲜的(可以从缓存中重用)或不新鲜的(由应用程序应该再生)。
  4. 边边包括(ESI)允许HTTP缓存来缓存页面片段独立(甚至嵌套的片段)。应急服务国际公司,你甚至可以缓存整个页面为60分钟,但是嵌入式栏只有5分钟。

由于与HTTP缓存并不是唯一的Symfony,很多文章已经存在的主题。欧宝娱乐app下载地址如果你是新到HTTP缓存,瑞安Tomayko一起合作编写的文章缓存做的事情高度推荐。另一个深入的资源是马克诺丁汉的缓存教程

网关缓存的缓存

与HTTP缓存时,缓存应用程序完全分开,应用程序和客户端之间的请求。

缓存的工作是接受来自客户端的请求并将其传递回您的应用程序。缓存还将接收响应从您的应用程序和转发到客户端。缓存是“中间人”的请求-响应客户端和应用程序之间的通信。

一路上,缓存将存储每个响应,被认为是“缓存”HTTP缓存)。请求相同的资源时,缓存将缓存的响应发送到客户端,完全无视您的应用程序。

这种类型的缓存被称为HTTP网关缓存和许多存在等清漆,乌贼在反向代理模式Symfony反向代欧宝娱乐app下载地址理。

类型的缓存

但是一个网关缓存并不是唯一类型的缓存。事实上,您的应用程序发送的HTTP缓存头消耗和解释了三个不同类型的缓存:

  • 浏览器缓存:每个浏览器都有自己的本地缓存,主要是用于当你点击“返回”或对图像和其他资产。浏览器缓存私人缓存不与任何人共享缓存的资源;
  • 代理缓存:一个代理共享缓存可以在一个尽可能多的人。通常是由大公司和互联网服务供应商安装减少延迟和网络流量;
  • 网关缓存:就像一个代理,它也是一个共享但是在服务器端缓存。由网络管理员安装,它使网站更加可伸缩、可靠和高性能。

提示

网关缓存有时也被称为反向代理缓存,代理缓存,甚至HTTP加速器。

请注意

的意义私人共享缓存将变得更加明显,当缓存响应包含的内容是特定于一个用户(如帐户信息)进行了探讨。

每个响应从您的应用程序可能会经过一个或两个前两个缓存类型。这些缓存超出你的控制,但遵循HTTP缓存方向设置的响应。

欧宝娱乐app下载地址Symfony反向代理

欧宝娱乐app下载地址Symfony附带了一个反向代理(也称为网关缓存)用PHP编写的。使它和缓存响应从您的应用程序将被缓存。安装一样容易。每一个新的Symf欧宝娱乐app下载地址ony应用程序附带了一个预配置缓存内核(AppCache)包装默认一个(AppKernel)。内核缓存反向代理。

要启用缓存,修改代码的前端控制器使用内核缓存:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /网络/ app.phprequire_once__DIR__“/ . . / app / bootstrap.php.cache”;require_once__DIR__“/ . . / app / AppKernel.php”;require_once__DIR__“/ . . / app / AppCache.php”;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;美元内核=AppKernel (“刺激”,);美元内核- >loadClassCache ();/ /包的默认AppKernel AppCache美元内核=AppCache (美元内核);美元请求=请求::createFromGlobals ();美元响应=美元内核- >处理(美元请求);美元响应- >send ();美元内核- >终止(美元请求,美元响应);

内核将立即作为反向代理缓存,缓存的响应从你的应用程序并返回给客户机。

谨慎

如果你使用framework.http_method_override选择阅读的HTTP方法_method参数,参见上面的链接,你需要做出调整。

提示

内核有一个特殊的缓存getLog ()方法返回的字符串表示发生在缓存层。在开发环境中,用它来调试和验证您的缓存策略:

1
error_log (美元内核- >getLog ());

AppCache对象有一个合理的缺省配置,但它可以通过一组精细选项可以设置通过重写getOptions ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / app / AppCache.php使用欧宝娱乐app下载地址\\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
组触发“私人”的请求头cache - control行为反应不明确状态是否响应公共私人通过一个cache - control指令(默认值:授权饼干)。
allow_reload
指定客户端可以通过包括强制缓存刷新cache - control“no - cache指令”的请求。将其设置为真正的为符合RFC 2616(默认值:)。
allow_revalidate
指定客户端可以通过包括强制缓存重新验证cache - control“信息= 0”指令的要求。将其设置为真正的为符合RFC 2616(默认值:)。
stale_while_revalidate
指定默认的秒数(粒度是第二个TTL精确的响应是一个秒)中缓存可以立即返回一个陈旧的响应而重新验证它在后台(默认值:2);这个设置是覆盖的stale-while-revalidateHTTPcache - control扩展(RFC 5861)。
stale_if_error
指定默认的秒数(粒度是第二),缓存可以过期响应当遇到一个错误(默认值:60)。这个设置是覆盖的stale-if-errorHTTPcache - control扩展(RFC 5861)。

如果调试真正的,S欧宝娱乐app下载地址ymfony会自动添加一个X-欧宝娱乐app下载地址Symfony-Cache头来响应包含有用的信息缓存命中率和未命中率。

Symf欧宝娱乐app下载地址ony反向代理是一个伟大的工具开发你的网站或者当您部署时使用你的网站到一个共享的主机,你不能安装任何超出的PHP代码。但是是用PHP编写的,它不能以最快的速度用c语言编写的一个代理为什么强烈建议你使用清漆或鱿鱼生产服务器,如果可能的话。好消息是,从一个代欧宝app在哪里找理服务器切换到另一个是容易的和透明的在您的应用程序不需要修改代码。开始简单的Symfony反向代理和升级后欧宝娱乐app下载地址清漆当你流量增加。

使用Symfony的清漆的更多信息,请参阅欧宝娱乐app下载地址如何使用清漆本章。

请注意

Symfony反向代理的性能是独立于应用程序的欧宝娱乐app下载地址复杂性。这是因为应用程序内核只是启动时需要转发请求。

介绍HTTP缓存

利用可用的缓存层,应用程序必须能够响应缓存和沟通的规则,这些规则控制何时/如何缓存应该成为过时。这是通过设置HTTP缓存响应标头。

提示

记住,“HTTP”只不过是语言(一个简单的文本语言),web客户端(例如浏览器)和web服务器使用与对方交流。HTTP缓存是语言的一部分,它允许客户端和服务器交换信息相关的缓存。

HTTP指定四个响应缓存头,看着这里:

  • cache - control
  • 到期
  • ETag
  • last - modified

最重要的和最多才多艺的头的cache - control头,这实际上是一个集合各种缓存信息。

请注意

每个头将详细解释HTTP缓存部分。

cache - control头

cache - control头的独特之处在于,它包含不止一个,但各种信息的可缓存性响应。每一块的信息是由一个逗号分开:

1 2 3
cache - control:私人信息= 0,must-revalidate cache - control: must-revalidate信息= 3600

欧宝娱乐app下载地址Symfony提供了一个抽象的cache - control头创造使其更易于管理的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;美元响应=反应();/ /响应标记为公共或私人美元响应- >setPublic ();美元响应- >setPrivate ();/ /设置私人或共享最大年龄美元响应- >setMaxAge (600年);美元响应- >setSharedMaxAge (600年);/ /设置一个定制的cache - control指令美元响应- >- >addCacheControlDirective (“must-revalidate”,真正的);

提示

如果您需要设置缓存头为许多不同的控制器操作,您可能想要考虑的FOSHttpCacheBundle。它提供了一种方法来定义缓存头根据请求URL模式和其他属性。

公共和私人的反应

网关和代理缓存都视为“共享”缓存的缓存的内容由多个用户共享。如果一个特定于用户的响应曾经错误地存储在共享缓存,它可能会返回后任意数量的不同的用户。想象一下,如果你的账户信息被缓存,然后回到每一个后续的用户要求他们的帐户页面!

处理这种情况,每个响应可能被设置为公共或私人:

公共
表明,响应可以由私人和共享缓存的缓存。
私人
表明,全部或部分的响应消息的目的是为单个用户,不能缓存共享缓存。

欧宝娱乐app下载地址Symfony保守违约每个响应是私有的。利用共享缓存(比如Symfony反向代理),响应需要显式地设置为公开。欧宝娱乐app下载地址

安全的方法

HTTP缓存只适用于“安全”的HTTP方法(比如GET和HEAD)。安全意味着你不会更改服务器上的应用程序的状态当服务请求(当然你可以日志信息,缓存数据,等等)。这有两个非常合理的后果:

  • 你应该从来没有改变您的应用程序的状态当响应GET或请求。即使你不使用一个网关缓存,代理缓存的存在意味着任何GET或HEAD请求实际上可能会或可能不会达到您的服务器;
  • 不要指望PUT、POST或删除缓存的方法。这些方法是变异时使用您的应用程序的状态(例如删除博客)。缓存会阻止某些请求和变异的应用程序。

缓存规则和违约

HTTP 1.1允许缓存任何默认情况下,除非有一个明确的cache - control头。在实践中,大多数缓存当请求有一个饼,一个授权头,使用non-safe方法(例如PUT、POST、DELETE),或者当反应有一个重定向状态代码。

欧宝娱乐app下载地址Symfony自动设置一个合理的和保守的cache - control头时由开发人员遵循这些规则:

  • 如果没有定义缓存头(cache - control,到期,ETaglast - modified),cache - control被设置为no - cache不,这意味着响应将被缓存;
  • 如果cache - control是空的(但另一个缓存头存在),它的值被设置为私人的,must-revalidate;
  • 但如果至少有一个cache - control指令集,没有公共私人指令已被显式地添加,Symfony补充道欧宝娱乐app下载地址私人(除非自动指令s-maxage设置)。

HTTP过期,验证和失效

HTTP规范定义了两个缓存模型:

  • 失效模式多久,只需指定一个响应应考虑由包括一个“新鲜”cache - control和/或一个到期头。缓存,理解过期不会犯同样的请求,直到缓存版本达到过期时间,成为“陈旧的”;
  • 当页面是动态(即表示经常改变),验证模型通常是必要的。在这个模型中,缓存存储响应,但问服务器的每个请求缓存的响应是否仍然有效。应用程序使用一个惟一的标识符(响应Etag和/或时间戳(头)last - modified头),以检查是否改变了由于缓存的页面。

两种模型的目标是永远不会产生相同的反应两次依靠一个缓存来存储并返回“新鲜”的反应。实现长时间的缓存,但仍立即提供更新内容,缓存失效有时使用。

HTTP规范定义了一个简单但功能强大的语言的客户端和服务器可以交流。作为web开发人员,规范的请求-响应模式主导你的工作。不幸的是,实际的规范文档RFC 2616——很难阅读。

有一个正在进行的工作(HTTP Bis)重写RFC 2616。它不描述HTTP的新版本,但主要是澄清原始HTTP规范。组织也改进规范分为七个部分;一切有关HTTP缓存可以在两个专用部分(P4 -条件要求P6 -缓存:浏览器和中介缓存)。

作为web开发人员,您是强烈敦促阅读规范。它的清晰度和权力——甚至超过十年后成立,是非常宝贵的。不要推脱的外观规范,其内容比封面更美丽。

过期

过期模型更有效和简单的两个缓存模型,应该尽可能地使用。响应缓存过期时,缓存将存储的响应并返回它直接触及应用程序,直到它到期。

失效模式可以实现使用两种,几乎相同,HTTP头信息:到期cache - control

过期的到期

根据HTTP规范”到期头部字段提供一个日期/时间的反应被认为是过时的。”的到期标题可以设置的setExpires ()响应方法。需要一个DateTime实例作为一个参数:

1 2 3 4
美元日期=DateTime ();美元日期- >修改(+ 600秒的);美元响应- >setExpires (美元日期);

生成的HTTP头是这样的:

1
到期:星期四,2011年3月01 16:00:00格林尼治时间

请注意

setExpires ()方法自动将日期转换为格林尼治时间时区的要求规范。

注意,在HTTP 1.1之前版本起源服务器不需要发送日期头。因此,缓存(如浏览器)可能需要依靠当地的时钟来评估到期头的寿命计算容易时钟歪斜。另一个限制到期头是规范规定,“不应该发送HTTP / 1.1服务器到期在未来日期超过一年。”

过期的cache - control

因为到期头的局限性,大多数时候,你应该使用cache - control头。回忆,cache - control头用于指定不同的缓存指令。过期,有两个指令,信息s-maxage。第一个是所有缓存使用的,而第二个是只考虑共享缓存:

1 2 3 4 5 6
/ /设置的秒数后响应/ /不应该再被认为是新鲜的美元响应- >setMaxAge (600年);/ /同上,但只有共享缓存美元响应- >setSharedMaxAge (600年);

cache - control头将承担以下格式(它可能有额外的指令):

1
cache - control:信息= 600,s-maxage = 600

验证

当一个资源需要更新一旦改变底层数据,过期模型不足。与失效模型,应用程序不会被要求返回更新后的响应,直到缓存最终变得陈旧。

验证模型解决了这个问题。在这种模式下,缓存继续存储的响应。不同的是,对于每个请求,缓存要求应用程序缓存的响应是否仍然有效或如果它需要再生。如果缓存仍然有效,您的应用程序应该返回304状态码,没有内容。这告诉缓存,可以返回缓存的响应。

在这种模式下,你只能节省CPU如果你能确定缓存的响应仍有效的通过工作比生成整个页面再次实现示例(见下文)。

提示

304状态代码的意思是“修改”。这很重要,因为这种响应状态码包含被请求的实际内容。相反,反应是一个轻量级的方向告诉缓存,它应该使用存储的版本。

像过期,有两种不同的HTTP头信息,可用于实现验证模型:ETaglast - modified

验证的ETag

ETag头是一个字符串头(称为“实体标记”)的唯一地标识一个表示目标资源。完全由应用程序生成,所以你可以告诉,例如,如果/对资源存储的缓存是最新的与您的应用程序将返回。一个ETag就像一个指纹并用于快速比较两个不同版本的资源如果是等价的。像指纹一样,每个ETag必须是唯一的所有表示相同的资源。

看到一个简单的实现,生成md5 ETag的内容:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / AppBundle /控制器/ DefaultController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;DefaultController扩展控制器{公共函数homepageAction(请求美元请求){美元响应=美元- >呈现(“静态/ homepage.html.twig”);美元响应- >setETag (md5 (美元响应- >getContent ()));美元响应- >setPublic ();/ /确保公共/缓存响应美元响应- >isNotModified (美元请求);返回美元响应;}}

isNotModified ()方法比较具有发送的请求ETag头设置在响应。如果两个匹配,自动设置的方法响应状态码304。

请注意

缓存设置具有请求头ETag原来的缓存的响应在发送请求之前回到应用程序。这是缓存和服务器相互通信并决定资源是否已经更新自缓存。

这个算法很简单,非常通用的,但是你需要创建整个响应能够计算出ETag之前,这是次优的。换句话说,它可以节省带宽,但不是CPU周期。

HTTP缓存节中,您将看到如何验证可以使用更加智能地决定一个缓存的有效性没有做这么多工作。

提示

欧宝娱乐app下载地址Symfony还支持弱etag通过真正的作为第二个参数setEtag ()方法。

验证的last - modified

last - modified头是第二个表单的验证。根据HTTP规范”last - modified头字段显示的日期和时间起源服务器认为表示最后修改。”In other words, the application decides whether or not the cached content has been updated based on whether or not it's been updated since the response was cached.< /p>

例如,您可以使用所需的所有对象的最新更新日期计算资源表示的值last - modified头的值:

1 2 3 4 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
/ / src / AppBundle /控制器/ ArticleController.php名称空间AppBundle\控制器;/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用AppBundle\实体\文章;ArticleController扩展控制器{公共函数showAction(文章美元文章,请求美元请求){美元作者=美元文章- >getAuthor ();美元articleDate=\ DateTime (美元文章- >getUpdatedAt ());美元authorDate=\ DateTime (美元作者- >getUpdatedAt ());美元日期=美元authorDate>美元articleDate吗?美元authorDate:美元articleDate;美元响应=反应();美元响应- >setLastModified (美元日期);/ /设置响应作为公共。否则会默认是私有的。美元响应- >setPublic ();如果(美元响应- >isNotModified (美元请求)){返回美元响应;}/ /……做更多的工作来填充完整的响应内容返回美元响应;}}

isNotModified ()方法比较if - modified - since头发出的请求last - modified头的响应。如果他们是等价的,响应将被设置为一个304状态码。

请注意

缓存设置if - modified - since请求头last - modified原来的缓存的响应在发送请求之前回到应用程序。这是缓存和服务器相互通信并决定资源是否已经更新自缓存。

优化你的代码与验证

任何缓存策略的主要目的是减轻负载应用程序。换句话说,你在你的应用程序返回一个304响应,越好。的回应::isNotModified ()方法准确,通过公开的一种简单而有效的模式:

1 2 3 4 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 35 36 37 38 39 40 41
/ / src / AppBundle /控制器/ ArticleController.php名称空间AppBundle\控制器;/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;ArticleController扩展控制器{公共函数showAction(美元articleSlug,请求美元请求){/ /获得最低的信息来计算/ / ETag或last - modified价值/ /(基于请求,检索数据/ /数据库或一个键值存储为例)美元文章=……;/ /创建一个与ETag和/或last - modified响应头中美元响应=反应();美元响应- >setETag (美元文章- >computeETag ());美元响应- >setLastModified (美元文章- >getPublishedAt ());/ /设置响应作为公共。否则会默认是私有的。美元响应- >setPublic ();/ /检查不修改给定的请求的响应如果(美元响应- >isNotModified (美元请求)){/ /返回304立即响应返回美元响应;}/ /做更多的工作,更喜欢检索数据美元评论=……;/ /或呈现一个模板与美元的响应你已经开始返回美元- >呈现(“文章/ show.html.twig”,数组(“文章”= >美元文章,“评论”= >美元评论),美元响应);}}

响应不修改isNotModified ()自动设置响应状态代码304年,删除内容,删除一些标题,不能出席304年反应(见setNotModified ())。

不同的响应

到目前为止,这是假定每个URI都有一个目标资源的表示。默认情况下,HTTP缓存是通过使用资源的URI作为缓存键。如果两个人请求相同的缓存资源的URI,第二个人将接收缓存的版本。

有时这是不够的,不同版本的相同的URI需要基于一个或多个请求报头值缓存。例如,如果您压缩页当客户机支持它,任何给定的URI有两个表示:当客户端支持压缩,和一个不。这决心的价值是通过接受编码请求头。

在这种情况下,您需要缓存中存储的压缩和未压缩版本响应特定的基于请求的URI和归还接受编码价值。这是通过使用不同响应头,这是一个以逗号分隔的不同标题的价值观引发的不同表示请求的资源:

1
不同:接受编码,用户代理

提示

这个特殊的不同头会缓存不同版本的每个资源URI和值的基础上接受编码用户代理请求头。

响应对象提供了一个干净的界面来管理不同标题:

1 2 3 4 5
/ /设置一个不同的头美元响应- >setVary (“接受编码”);/ /设置多个不同头文件美元响应- >setVary (数组(“接受编码”,“用户代理”));

setVary ()方法接受一个头名称或标题名称的数组的响应不同。

过期和验证

您当然可以使用验证和过期在相同的响应。过期赢在验证,您可以很容易地受益于两全其美。换句话说,通过使用过期和验证,您可以指示缓存服务缓存的内容,虽然检查回顾一些间隔(过期)验证内容仍然有效。

提示

您还可以定义HTTP缓存头供使用注释过期和验证。看到FrameworkExtraBundle文欧宝体育电话档

更反应的方法

响应缓存相关类提供了更多的方法。这里是最有用的:

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,“公共”= >真正的,/ /“私人”= >真的,));

缓存失效

“计算机科学中只有两个艰难的事:缓存失效和命名的事情。”-- Phil Karlton< /p>

一旦一个URL由网关缓存的缓存,缓存将不再要求应用程序的内容。这允许缓存提供快速反应并减少应用程序的负载。然而,你的风险提供过时的内容。走出这一困境的方法是使用长缓存,但积极内容更改时通知网关缓存。反向代理通常提供一个通道来接收这些通知,通常通过特殊的HTTP请求。

谨慎

当缓存失效是强大的,尽可能避免它。如果你失败了无效,过时的缓存将服役时间可能很长。相反,使用寿命短的缓存或使用验证模型,并调整控制器作为解释执行有效的验证检查HTTP缓存

此外,由于失效是一个特定于每个主题类型的反向代理,使用这一概念将你特定的反向代理或需要额外的努力来支持不同的代理。

但是,有时候你需要额外的性能你可以当明确无效。为无效,您的应用程序需要检测内容更改时,告诉缓存删除url包含数据从缓存中。

提示

如果你想使用缓存失效,看一看FOSHttpCacheBundle。这个包提供了服务,帮助还各种缓存失效概念和文档配置几个常见的缓存代理。

如果一个内容对应一个URL,清洗模型运行良好。你发送一个请求到缓存代理与HTTP方法清洗(使用“清除”这个词是一个约定,技术上可以任何字符串)来代替得到并使缓存代理检测这和删除数据从缓存中,而不是应用程序得到回应。

这里是如何配置Symfony反向代理来支持欧宝娱乐app下载地址清洗HTTP方法:

1 2 3 4 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
/ / app / AppCache.php使用欧宝娱乐app下载地址\\FrameworkBundle\HttpCache\HttpCache;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;/ /……AppCache扩展HttpCache{受保护的函数无效(请求美元请求,美元= false){如果(“清除”= = !美元请求- >getMethod ()) {返回::无效(美元请求,美元);}如果(“127.0.0.1”= = !美元请求- >getClientIp ()) {返回响应(“无效的HTTP方法”,400年);}美元响应=反应();如果(美元- >getStore ()- >清洗(美元请求- >getUri ())) {美元响应- >setStatusCode (200年,“清除”);}其他的{美元响应- >setStatusCode (404年,“没有找到”);}返回美元响应;}}

谨慎

你必须保护清洗HTTP方法避免随机人清除你的缓存数据。

清洗指示缓存资源所有的变量(根据不同头,见上图)。另一种清除让人耳目一新一个内容。刷新意味着缓存代理指示抛弃其本地缓存和获取内容。这样,新内容已经在缓存中可用。清爽的缺点是,不失效。

在许多应用程序中,相同的内容在各个页面上使用不同的url。更灵活的概念存在的情况下:

  • 禁止无效响应匹配正则表达式在URL或其他标准;
  • 缓存标签允许您添加一个标签用于响应的每个内容,这样您就可以包含特定内容的所有url失效。

使用边缘方面包括

网关缓存是一个伟大的方式,让你的网站有更好的表现。但是他们有一个限制:他们只能缓存整个页面。如果你不能缓存整个页面或者页面的部分有“更多”的动态部分,你运气不好。这些情况下,幸运的是,Sy欧宝娱乐app下载地址mfony提供了一个解决方案基于技术应急服务国际公司包括,或者边一边。Akamai写此规范近10年前,它允许页面的特定部分比主页有不同的缓存策略。

应急服务国际公司规范描述标签可以嵌入在页面缓存与网关进行通信。只有一个标记在Symfony中实现,欧宝娱乐app下载地址包括外,这是唯一有用的Akamai上下文:

1 2 3 4 5 6 7 8 9 10 11
< ! DOCTYPEhtml><html><身体>< !——……一些内容- - >< !——嵌入另一个页面的内容- - ><应急服务国际公司:包括src=“http://..”。/ >< !——……更多内容- - >< /身体>< /html>

请注意

注意每个ESI标签的例子有一个完全限定的URL。一个ESI标记表示一个页面片段,可以通过给定的URL获取。

当请求处理时,网关缓存获取整个页面的缓存或从后端应用程序的请求。如果响应包含一个或多个ESI标签,这些都是用同样的方式处理。换句话说,网关缓存检索包括页面片段缓存的或从后端应用程序请求的页面片段了。当所有的ESI标签已经得到解决,网关缓存合并每个进入主页,将最后的内容发送给客户机。

所有这一切发生透明网关缓存级别(即以外的应用程序)。您将看到,如果你选择利用ESI标签,Symfony会包括他们几乎毫不费力的过程。欧宝娱乐app下载地址

在Symfony中使用应急欧宝娱乐app下载地址服务国际公司

首先,使用应急服务国际公司,一定要使它在应用程序中配置:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / config.yml框架:#……应急服务国际公司:{启用:真正的}

现在,假设您有一个页面,是相对静态的,除了新闻股票底部的内容。欧宝app在哪里找应急服务国际公司,您可以缓存的新闻播报独立页面的其余部分欧宝app在哪里找。

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / AppBundle /控制器/ DefaultController.php/ /……DefaultController扩展控制器{公共函数aboutAction(){美元响应=美元- >呈现(“静态/ about.html.twig”);/ /设置共享的最大年龄——这也标志着公众反应美元响应- >setSharedMaxAge (600年);返回美元响应;}}

在这个例子中,整页缓存一生的十分钟。接下来,包括新闻播报模板通过嵌入一个欧宝app在哪里找动作。这是通过的渲染辅助(见创建和使用模板更多的细节)。

作为嵌入式内容来自另一个页面(或控制器),Symfony使用标准欧宝娱乐app下载地址渲染辅助配置ESI标签:

  • 嫩枝
  • PHP
1 2 3 4 5 6 7
{# app /资源/视图/静态/ about.html。树枝#}{#你可以用一个控制器参考#}{{render_esi(控制器(AppBundle:新闻:最新,{“m欧宝app在哪里找axPerPage”: 5}))}}{#……或URL #}{{render_esi (url (latest_欧宝app在哪里找news, {“maxPerPage”: 5}))}}

通过使用应急服务国际公司渲染器(通过render_esi树枝函数),你告诉Symfony行动应该呈现为一个欧宝娱乐app下载地址ESI标签。你可能想知道为什么要使用一个辅助而不是自己写ESI标签。这是因为使用帮助使您的应用程序安装工作即使没有网关缓存。

提示

正如您将在下面看到的,maxPerPage变量可以作为参数传递给你控制器(即。maxPerPage美元)。变量通过render_esi也成为缓存键的一部分,这样你有独特的缓存为每个变量和值的组合。

当使用默认渲染函数(或设置渲染器内联),S欧宝娱乐app下载地址ymfony将包括页面内容合并到主前发送响应给客户端。但是如果你使用应急服务国际公司渲染器(即调用render_esi)如果S欧宝娱乐app下载地址ymfony检测到与网关缓存支持应急服务国际公司,它生成一个应急服务国际公司包括标签。但如果没有网关缓存或如果它不支持ESI, Symfony会合并包括页面中的内容主要的一个,因为它会做如果你有使用欧宝娱乐app下载地址渲染

请注意

欧宝娱乐app下载地址Symfony检测通过另一个如果一个网关缓存支持ESI Akamai规范,支持开箱即用的Symfony反向代理。

嵌入的行动现在可以指定自己的缓存规则,完全独立于主页。

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / AppBundle /控制器/ Ne欧宝app在哪里找wsController.php名称空间AppBundle\控制器;/ /……欧宝app在哪里找NewsController扩展控制器{公共函数latestAction(美元maxPerPage){/ /……美元响应- >setSharedMaxAge (60);返回美元响应;}}

应急服务国际公司,整页缓存将有效期为600秒,但是新闻组件缓存只会持续60秒。欧宝app在哪里找

当使用一个控制器参考,ESI标签应该引用嵌入的行动作为一个URL访问网关缓存可以取回它独立于页面的其余部分。欧宝娱乐app下载地址Symfony负责生成惟一的URL为任何控制器参考和它能够正确路线它们由于FragmentListener在您的配置,必须启用:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / config.yml框架:#……片段:{路径:/ _fragment}

ESI渲染器的一个很大的优势是,您可以让您的应用程序根据需要动态的同时,达到应用程序尽可能少。

谨慎

片段侦听器只响应签名的请求。请求只有当使用片段渲染器和签署render_esi树枝的功能。

请注意

一旦你开始使用应急服务国际公司,记得总是使用s-maxage指令,而不是信息。当浏览器只接收聚合资源,它不知道子组件,所以它会遵守信息指令和缓存整个页面。你不想要。

render_esi辅助支持两种其他有用的选项:

alt
用作alt属性ESI标签,它允许您指定一个替代URL,如果使用src不能被发现。
ignore_errors
如果设置为真,一个onerror属性将被添加到应急服务国际公司的价值继续表明,在发生故障时,网关缓存只会默默地删除ESI标签。

总结

欧宝娱乐app下载地址Symfony旨在遵循证明规则:HTTP。缓存也不例外。掌握Symfony缓存系统意欧宝娱乐app下载地址味着熟悉HTTP缓存模型和有效地使用它们。这意味着,而不是仅仅依靠Symfony的文档和代码示例,您可以访问世界的知识与HTTP缓欧宝娱乐app下载地址存和清漆等网关缓欧宝体育电话存。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。