HTTP缓存

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

HTTP缓存

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

在巨人的肩膀上奔跑

使用HTTP缓存,您可以缓存页面的全部输出(即响应)并绕过您的应用程序完全在后续请求中。缓存整个响应对于高度动态的站点并不总是可行的,不是吗?与边缘包含(ESI),您只能使用HTTP缓存的功能片段你的网站。

Symfob娱乐下载ony缓存系统是不同的,因为它依赖于HTTP缓存的简单性和功能RFC 7234 -缓存.Symfony没有重新发明缓存方法,而是采用了定义Web上基本通信的标准。ob娱乐下载一旦您理解了基本的HTTP验证和过期缓存模型,您就可以掌握Symfony缓存系统了。ob娱乐下载

由于使用HTTP进行缓存并不是Symfony独有的,因此已经有很多关于这个主题的ob娱乐下载文章。如果您不熟悉HTTP缓存,请参阅Ryan Tomayko的文章缓存的作用高度推荐。另一个深度资源是Mark Nottingham的缓存教程

使用网关缓存进行缓存

使用HTTP进行缓存时,缓存它与应用程序完全分离,位于应用程序和发出请求的客户端之间。

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

在此过程中,缓存将存储每个被视为“可缓存”的响应(参见HTTP缓存).如果再次请求相同的资源,缓存将缓存的响应发送到客户机,完全忽略应用程序。

这种类型的缓存被称为HTTP网关缓存,存在许多缓存,例如清漆鱿鱼在反向代理模式,以及Symfonyob娱乐下载反向代理。

提示

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

ob娱乐下载Symfony反向代理

ob娱乐下载Symfony附带了一个用PHP编写的反向代理(即网关缓存)。它不像Varnish那样是一个功能齐全的反向代理缓存,但这是一个很好的开始。

提示

有关设置清漆的详细信息,请参见如何使用清漆来加快我的网站

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

1 2 3 4 5 6 7 8
/ / src / CacheKernel.php名称空间应用程序使用ob娱乐下载FrameworkBundleHttpCacheHttpCacheCacheKernel扩展HttpCache{}

修改前端控制器的代码,将默认内核封装到缓存内核中:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ /公共/ index . php+使用App\CacheKernel;使用App \内核;/ /……内核美元=新内核($ _SERVER [' APP_ENV '], (bool) $ _SERVER [' APP_DEBUG ']);+ //在prod环境中用CacheKernel包装默认内核+ if ('prod' === $kernel->getEnvironment()) {+ $kernel = new CacheKernel($kernel);+}$request = request::createFromGlobals();/ /……

缓存内核将立即充当反向代理:缓存来自应用程序的响应并将它们返回给客户机。

谨慎

如果你在用framework.http_method_override选项来读取HTTP方法_method参数,请参阅上面的链接,了解需要进行的调整。

提示

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

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

CacheKernel对象具有合理的默认配置,但是可以通过覆盖所设置的一组选项对其进行微调getOptions ()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / CacheKernel.php名称空间应用程序使用ob娱乐下载FrameworkBundleHttpCacheHttpCacheCacheKernel扩展HttpCache受保护的函数getOptions()返回“default_ttl”= >0/ /……];}}

有关选项及其含义的完整列表,请参见HttpCache: __construct()的欧宝官网下载app文档

当处于调试模式时(的第二个参数内核前置控制器中的构造函数为真正的), ob娱乐下载Symfony自动添加一个X-ob娱乐下载Symfony-Cache头指向响应。你也可以使用trace_level选项,并将其设置为任意一个没有一个完整的添加此信息。

将仅为主请求添加信息。它以一种简洁的方式编写,可以很容易地在服务器日志文件中记录信息。例如,在Apache中您可以使用% {Xob娱乐下载-Symfony-Cache} oLogFormat格式语句。此信息可用于提取有关路由缓存效率的一般信息。

提示

属性可以更改用于跟踪信息的标头的名称trace_header配置选项。

4.3

trace_level而且trace_header在Symfony 4.3中引入了配置选项。ob娱乐下载

Symfob娱乐下载ony反向代理是一个很好的工具,当你开发你的网站,或者当你部署你的网站到一个共享主机,你不能安装除PHP代码以外的任何东西。但是由于它是用PHP编写的,所以速度不如用C编写的代理。

幸运的是,由于所有反向代理实际上都是相同的,因此您应该能够切换到更健壮的东西——比如Varnish——而不会出现任何问题。看到如何使用清漆

使你的响应HTTP可缓存

一旦添加了反向代理缓存(例如Symfony反向代理或Varnish),就可以缓存响应了。ob娱乐下载要做到这一点,你需要沟通到你的缓存哪一个响应是可缓存的,以及缓存多长时间。这是通过在响应上设置HTTP缓存头来实现的。

HTTP指定了四个响应缓存头,您可以设置为启用缓存:

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

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

  1. 过期的缓存用于在特定的时间内缓存您的整个响应(例如24小时)。简单,但是缓存失效比较困难。
  2. 验证缓存更复杂:用于缓存响应,但允许您在内容更改时动态地使其失效。

您将读到的所有HTTP报头都是是Symfony发明的!ob娱乐下载它们是HTTP规范的一部分,所有网站都在使用。要深入了解HTTP缓存,请查看文档RFC 7234 -缓存而且rfc7232 -条件请求

作为web开发人员,强烈建议您阅读规范。它的清晰性和力量——即使在创立15年之后——仍然是无价的。不要被说明书的外表所迷惑——它的内容比它的外表漂亮得多!

过期的缓存

简单的缓存响应的方法是通过缓存特定的时间:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /控制器/ BlogController.php使用ob娱乐下载组件HttpFoundation响应/ /……公共函数指数()//以某种方式创建一个Response对象,比如通过呈现一个模板响应->呈现(“博客/ index.html.twig”[]);//缓存3600秒响应->setSharedMaxAge (3600);//(可选)设置一个自定义Cache-Control指令响应->->addCacheControlDirective (“must-revalidate”真正的);返回响应;}

多亏了这个新代码,你的HTTP响应将有以下报头:

1
Cache-Control: public, s-maxage=3600,必须重新验证

这告诉您的HTTP反向代理将此响应缓存3600秒。如果任何人在3600秒之前再次请求此URL,您的应用程序不会被击中了。如果您正在使用Symfony反向代理,请ob娱乐下载查看X-ob娱乐下载Symfony-Cache头,用于调试缓存命中和未命中的信息。

提示

请求的URI被用作缓存键(除非您不同).

这提供了出色的性能,并且使用简单。但是,缓存失效不支持。如果内容更改,则需要等待缓存过期才能更新页面。

提示

事实上,你可以手动使您的缓存无效,但这不是HTTP缓存规范的一部分缓存失效

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

最后,有关过期缓存的更多信息,请参见HTTP缓存过期

验证缓存

对于过期缓存,您会说“缓存3600秒!”但是,当有人更新缓存的内容时,直到缓存过期,您才会在您的站点上看到该内容。

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

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

安全方法:只缓存GET或HEAD请求

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

  • 不要尝试缓存PUT或DELETE请求。这是行不通的,而且理由很充分。这些方法用于改变应用程序的状态(例如删除一篇博客文章)。缓存它们可以防止某些请求攻击和改变应用程序。
  • POST请求通常被认为是不可缓存的,但是它们可以被缓存当它们包含显式的新鲜度信息时。但是,POST缓存并没有被广泛实现,所以您应该尽可能避免使用它。
  • 你应该从来没有当响应GET或HEAD请求时,改变应用程序的状态(例如更新博客文章)。如果这些请求被缓存,将来的请求可能不会真正到达服务器。

更多响应方法

Response类提供了更多与缓存相关的方法。以下是最有用的方法:

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“公共”= >真正的// 'private' => true,]);

缓存失效

缓存失效是HTTP规范的一部分。不过,一旦站点上的某些内容更新了,就立即删除各种HTTP缓存条目是非常有用的。

详细信息请参见缓存失效

使用边缘包含

当页面包含动态部分时,您可能无法缓存整个页面,而只能缓存其中的部分。读使用边缘包含了解如何为页面的特定部分配置不同的缓存策略。

HTTP缓存和用户会话

无论何时在请求期间启动会话,Symfony都会将响应转换为私有的不可缓存响应。ob娱乐下载这是最好的默认行为,不缓存私人用户信息(例如购物车、用户配置文件详细信息等)并将其暴露给其他访问者。

然而,在某些情况下,即使使用会话的请求也可以被缓存。例如,可以为属于该组的所有用户缓存与某个用户组相关的信息。处理这些高级缓存场景超出了Symfony的范围,但是可以使用ob娱乐下载FOSHttpCacheBundle

为了禁用Symfony默认的使使用会话的请求不可缓存的行为,将以ob娱乐下载下内部头添加到您的响应中,Symfony将不会修改它:

1 2 3
使用ob娱乐下载组件HttpKernelEventListenerAbstractSessionListener响应->->集(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER,“真正的”);

总结

ob娱乐下载Symfony的设计遵循了经过验证的规则:HTTP。缓存也不例外。掌握Symfony缓存系统意ob娱乐下载味着熟悉HTTP缓存模型并有效地使用它们。这意味着,您不再仅仅依赖于Symfony文档和代码示例,而是可以访问与HTTP缓存和网关ob娱乐下载缓存(如Varn欧宝官网下载appish)相关的大量知识。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。