HTTP缓存验证

编辑该页面

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

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

HTTP缓存验证

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

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

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

提示

304状态代码的意思是“修改”。这很重要,因为这种响应状态码包含被请求的实际内容。相反,只由响应头的响应,告诉缓存,它可以利用其存储版本的内容。

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

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

提示

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

验证的ETag

HTTP ETag(“实体标记”)头是一个可选的HTTP头,其价值是一个任意字符串,唯一地标识一个表示目标的资源。完全由应用程序生成,所以你可以告诉,例如,如果/对资源存储的缓存是最新的与您的应用程序将返回。

一个ETag就像一个指纹并用于快速比较两个不同版本的资源如果是等价的。像指纹一样,每个ETag必须是唯一的所有表示相同的资源。

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

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

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

请注意

当使用mod_deflatemod_brotli在Apache 2.4,原创ETag(例如,如果值是修改ETag喷火,Apache就成foo-gzipfoo-br),它打破了ETag的验证。

你可以控制这种行为DeflateAlterETagBrotliAlterETag指令。或者,您可以使用下面的Apache配置保持原始ETag和修改后的一个压缩时的反应:

1
RequestHeader编辑“具有”“^”((. *),(gzip | br))”“美元" $ 1 "," $ 2 "

请注意

缓存设置具有请求头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.

例如,您可以使用所需的所有对象的最新更新日期计算资源表示的值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 /控制器/ ArticleController.php名称空间应用程序\控制器;/ /……使用应用程序\实体\文章;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;ArticleController扩展AbstractController{公共函数显示(文章美元文章,请求美元请求){美元作者=美元文章- >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 /控制器/ ArticleController.php名称空间应用程序\控制器;/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;ArticleController扩展AbstractController{公共函数显示(美元articleSlug,请求美元请求){/ /获得最低的信息来计算/ / ETag或last - modified价值/ /(基于请求,检索数据/ /数据库或一个键值存储为例)美元文章=……;/ /创建一个与ETag和/或last - modified响应头中美元响应=反应();美元响应- >setEtag (美元文章- >computeETag ());美元响应- >setLastModified (美元文章- >getPublishedAt ());/ /设置响应作为公共。否则会默认是私有的。美元响应- >setPublic ();/ /检查不修改给定的请求的响应如果(美元响应- >isNotModified (美元请求)){/ /返回304立即响应返回美元响应;}/ /做更多的工作,更喜欢检索数据美元评论=……;/ /或呈现一个模板与美元的响应你已经开始返回美元- >呈现(“文章/ show.html.twig”,(“文章”= >美元文章,“评论”= >美元评论),美元响应);}}

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

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