HTTP缓存

编辑该页面

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

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

HTTP缓存

丰富的web应用程序的本质意味着他们的动态。无论多么高效的应用程序,每个请求总是含有更多的开销比静态文件。通常,这很好。但是当你需要你的请求闪电快,你需要HTTP缓存。

缓存在巨人的肩膀上

HTTP缓存,缓存页面的完整输出(响应),绕过您的应用程序完全在后续请求中。缓存整个反应并不总是可能的高度动态的网站,还是?与边边包括(ESI)上,您可以使用HTTP缓存的力量片段你的网站。

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

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

网关缓存的缓存

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

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

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

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

提示

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

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

欧宝娱乐app下载地址Symfony附带了一个反向代理用PHP编写的(即网关缓存)。平台反向代理缓存,它不是一个像清漆,但是是一个伟大的方式开始。

提示

有关设置清漆,明白了如何使用清漆加快我的网站吗

要启用代理,首先创建一个内核缓存:

1 2 3 4 5 6 7 8
/ / src / CacheKernel.php名称空间应用程序;使用欧宝娱乐app下载地址\\FrameworkBundle\HttpCache\HttpCache;CacheKernel扩展HttpCache{}

修改代码前端控制器的包装默认内核到内核缓存:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /公共/ index . php+使用App \ CacheKernel;使用App \内核;/ /……内核美元=新内核($ _SERVER [' APP_ENV '], (bool) $ _SERVER [' APP_DEBUG ']);+ / /包装默认内核CacheKernel“刺激”的环境+如果(“刺激”= = = $内核- > getEnvironment ()) {+ $内核=新CacheKernel($内核);+}美元请求=请求:createFromGlobals ();/ /……

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

谨慎

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

提示

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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / CacheKernel.php名称空间应用程序;使用欧宝娱乐app下载地址\\FrameworkBundle\HttpCache\HttpCache;CacheKernel扩展HttpCache{受保护的函数getOptions():数组{返回(“default_ttl”= >0,/ /……];}}

选项的完整列表和他们的意义,看到了HttpCache: __construct()的欧宝体育电话文档

当你在调试模式(第二个参数内核构造函数在前端控制器真正的),S欧宝娱乐app下载地址ymfony会自动添加一个X-欧宝娱乐app下载地址Symfony-Cache头来响应。您还可以使用trace_level配置选项和设置它没有一个,完整的添加这个信息。

只添加主请求的信息。用简洁的方式,便于记录您的服务器日志文件中的信息。例如,在Apache您可以使用% {X欧宝娱乐app下载地址-Symfony-Cache} oLogFormat格式语句。这些信息可以用来提取通用信息缓存路由效率。

提示

你可以改变标题的名称用于跟踪信息使用trace_header配置选项。

Symf欧宝娱乐app下载地址ony反向代理是一个伟大的工具开发你的网站或者当您部署时使用你的网站到一个共享的主机,你不能安装任何超出的PHP代码。但是是用PHP编写的,它不能以最快的速度用C编写的一个代理。

幸运的是,由于所有反向代理实际上是一样的,你应该能够切换到更健壮的——就像清漆一样——没有任何问题。看到如何使用清漆

让你的响应HTTP缓存

一旦你添加了一个反向代理缓存(例如像Symfony反向代理或清漆),你准备缓存响应。欧宝娱乐app下载地址要做到这一点,你需要沟通你的缓存哪一个响应缓存和多长时间。这是通过设置HTTP缓存响应标头。

HTTP指定四个响应缓存头,你可以设置为启用高速缓存:

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

这四个标题是用来帮助你缓存响应通过两个不同的模型:

  1. 过期的缓存用于缓存整个反应为一个特定的时间(例如24小时)。简单,但缓存失效是更加困难。
  2. 验证缓存更复杂:用于缓存你的反应,但允许您动态无效就你的内容变化。

所有的HTTP头你会读到Symfony发明的!欧宝娱乐app下载地址他们使用的HTTP规范的一部分网站在互联网。深入挖掘HTTP缓存,查看文档RFC 7234 -缓存RFC 7232,有条件的请求

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

过期的缓存

简单的缓存响应的缓存方式为一个特定的时间:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /控制器/ BlogController.php使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;/ /……公共函数指数(){/ /创建一个响应对象,通过呈现模板美元响应=美元- >呈现(“博客/ index.html.twig”[]);/ /缓存公开3600秒美元响应- >setPublic ();美元响应- >setMaxAge (3600年);/ /(可选)设置一个定制的cache - control指令美元响应- >- >addCacheControlDirective (“must-revalidate”,真正的);返回美元响应;}

多亏了这个新代码,你的HTTP响应会有以下标题:

1
cache - control:公共,must-revalidate maxage = 3600

这告诉你的HTTP反向代理缓存该反应为3600秒。如果任何人再次请求这个URL前3600秒,您的应用程序不会受到打击。如果你使用Symfony的反向代理,看看欧宝娱乐app下载地址X-欧宝娱乐app下载地址Symfony-Cache标题关于缓存命中率和未命中率的调试信息。

提示

请求的URI作为缓存键(除非你不同)。

这提供了很好的性能和易于使用。但是,缓存失效不支持。如果你的内容改变,你需要等到你的缓存过期页面更新。

提示

事实上,你可以手动缓存失效,但它不是HTTP缓存规范。看到的一部分缓存失效

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

最后,对于更多信息过期缓存,明白了HTTP缓存过期

验证缓存

过期的缓存,你说“缓存3600秒!”。但是,当有人更新缓存的内容,你才发现你网站上的内容缓存到期。

如果你需要看更新后的内容立即,你需要无效你的缓存使用验证缓存模型。

有关详细信息,请参见HTTP缓存验证

安全的方法:只缓存获取或HEAD请求

HTTP缓存只适用于“安全”的HTTP方法(比如GET和HEAD)。这意味着三件事:

  • 不要缓存PUT或DELETE请求。它不会工作,并有很好的理由。这些方法是变异时使用您的应用程序的状态(例如删除博客)。缓存会阻止某些请求和变异的应用程序。
  • POST请求通常被认为是当前时间,但是他们可以被缓存当他们包括明确的新鲜信息。然而,帖子缓存并没有被广泛使用,所以如果可能的话你应该避免它。
  • 你应该从来没有改变您的应用程序的状态(例如更新博客)当响应GET或请求。如果这些请求缓存,未来可能没有出现在你的服务器的请求。

更反应的方法

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

1 2 3 4 5
/ /标志着陈旧的响应美元响应- >到期();/ /部队响应返回一个304响应,没有内容美元响应- >setNotModified ();

此外,大多数可以通过设置缓存相关的HTTP头单身setCache ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /使用该方法来设置一些缓存设置在一个电话/ /(本例中列出了所有可用的缓存设置)美元响应- >setCache ([“must_revalidate”= >,“no_cache”= >,“no_store”= >,“no_transform”= >,“公共”= >真正的,“私人”= >,“proxy_revalidate”= >,“max_age”= >600年,“s_maxage”= >600年,“不变”= >真正的,“last_modified”= >\ DateTime (),“etag”= >“六边形abcdef”]);

5.1

must_revalidate,no_cache,no_store,no_transformproxy_revalidate指令在Symfony 5.1中引入的。欧宝娱乐app下载地址

缓存失效

缓存失效HTTP规范的一部分。不过,它可以真正有用的删除各种HTTP缓存条目就会更新一些内容在你的网站上。

有关详细信息,请参见缓存失效

使用边缘方面包括

当页面包含动态部分,你可能无法缓存整个页面,但只有部分。读包括使用边缘一边找出如何配置不同的缓存策略页面的特定部分。

HTTP缓存和用户会话

只要会话中启动请求,Symfony的反应变成一个私人停机的回应。欧宝娱乐app下载地址这是最好的默认行为不缓存私人用户信息(如购物车、用户配置文件的细节,等)并将其公开给其他游客。

然而,即使利用会话的请求在一些情况下可以缓存。例如,一些用户组相关信息可以被缓存的用户所属的组。处理这些高级高速缓存场景的Symfony的范围,但他们可以解决的欧宝娱乐app下载地址FOSHttpCacheBundle

为了禁用默认Symfony行为使请求使用会话各种添加以下内部头你欧宝娱乐app下载地址的反应和Symfony不会修改:

1 2 3
使用欧宝娱乐app下载地址\组件\HttpKernel\EventListener\AbstractSessionListener;美元响应- >- >集(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER,“真正的”);

总结

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

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