HTTP缓存验证

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

HTTP缓存验证

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

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

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

提示

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

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

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

提示

您还可以定义HTTP缓存头供使用注释过期和验证。看到FrameworkExtraBundle文欧宝官网下载app档

验证的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\控制器;使用ob娱乐下载\组件\HttpFoundation\请求;DefaultController扩展控制器{公共函数homepageAction(请求美元请求){美元响应=美元- >呈现(“静态/ homepage.html.twig”);美元响应- >setEtag (md5 (美元响应- >getContent ()));美元响应- >setPublic ();/ /确保公共/缓存响应美元响应- >isNotModified (美元请求);返回美元响应;}}

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

请注意

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