HTTP缓存验证
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
HTTP缓存验证
当一个资源需要更新一旦改变底层数据,过期模型不足。与失效模式,应用程序不会被要求返回更新后的响应,直到缓存最终变得陈旧。
验证模型解决了这个问题。在这种模式下,缓存继续存储的响应。不同的是,对于每个请求,缓存要求应用程序缓存的响应是否仍然有效或如果它需要再生。如果缓存是仍然有效,您的应用程序应该返回304状态码,没有内容。这告诉缓存,可以返回缓存的响应。
在这种模式下,你只能节省CPU如果你能确定缓存的响应仍有效的通过少工作比生成整个页面再次实现示例(见下文)。
提示
304状态代码的意思是“修改”。这很重要,因为这种响应状态码不包含被请求的实际内容。相反,只由响应头的响应,告诉缓存,它可以利用其存储版本的内容。
像过期,有两种不同的HTTP头信息,可用于实现验证模型:ETag
和last - modified
。
过期和验证
您可以使用验证和过期在相同的响应
。过期赢在验证,你可以受益于两全其美。换句话说,通过使用过期和验证,您可以指示缓存服务缓存的内容,虽然检查回顾一些间隔(过期)验证内容仍然有效。
提示
您还可以定义HTTP缓存头供使用注释过期和验证。看到FrameworkExtraBundle文欧宝官网下载app档。
验证的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名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\请求;类DefaultController扩展AbstractController{公共函数主页(请求美元请求){美元响应=美元这- >呈现(“静态/ homepage.html.twig”);美元响应- >setEtag (md5 (美元响应- >getContent ()));美元响应- >setPublic ();/ /确保公共/缓存响应美元响应- >isNotModified (美元请求);返回美元响应;}}
的isNotModified ()方法比较具有
头的ETag
响应头。如果两个匹配,自动设置的方法响应
状态码304。
请注意
当使用mod_deflate
或mod_brotli
在Apache 2.4,原创ETag
(例如,如果值是修改ETag
是喷火
,Apache就成foo-gzip
或foo-br
),它打破了ETag
的验证。
你可以控制这种行为DeflateAlterETag和BrotliAlterETag指令。或者,您可以使用下面的Apache配置保持原始ETag
和修改后的一个压缩时的反应:
1
RequestHeader编辑“具有”“^”((. *),(gzip | br))”“美元" $ 1 "," $ 2 "”
请注意
缓存设置具有
请求头ETag
原来的缓存的响应在发送请求之前回到应用程序。这是缓存和服务器相互通信并决定资源是否已经更新自缓存。
这个算法是非常通用的,但是你需要创建整个响应
能够计算出之前ETag
,这是次优的。换句话说,它可以节省带宽,但不是CPU周期。
在HTTP缓存验证节中,您将看到如何验证可以使用更加智能地决定一个缓存的有效性没有做这么多工作。
提示
ob娱乐下载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名称空间应用程序\控制器;/ /……使用应用程序\实体\文章;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\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名称空间应用程序\控制器;/ /……使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;类ArticleController扩展AbstractController{公共函数显示(美元articleSlug,请求美元请求){/ /获得最低的信息来计算/ / ETag或last - modified价值/ /(基于请求,检索数据/ /数据库或一个键值存储为例)美元文章=……;/ /创建一个与ETag和/或last - modified响应头中美元响应=新反应();美元响应- >setEtag (美元文章- >computeETag ());美元响应- >setLastModified (美元文章- >getPublishedAt ());/ /设置响应作为公共。否则会默认是私有的。美元响应- >setPublic ();/ /检查不修改给定的请求的响应如果(美元响应- >isNotModified (美元请求)){/ /返回304立即响应返回美元响应;}/ /做更多的工作,更喜欢检索数据美元评论=……;/ /或呈现一个模板与美元的响应你已经开始返回美元这- >呈现(“文章/ show.html.twig”,(“文章”= >美元文章,“评论”= >美元评论),美元响应);}}
当响应
不修改isNotModified ()
自动设置响应状态代码304年
,删除内容,删除一些标题,不能出席304年
反应(见setNotModified ())。