HTTP缓存

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

HTTP缓存

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

在巨人的肩膀上奔跑

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

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

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

使用网关缓存进行缓存

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

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

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

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

提示

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

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

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

提示

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

启用代理很容易:每个应用程序都有一个缓存内核(AppCache),它封装了默认的(AppKernel).缓存内核反向代理。

要启用缓存,请修改前端控制器的代码。您还可以对app_dev.php控件中添加缓存dev环境:

12 3 4 5 6 7 8 9 10 11 12
/ /网络/ app.php/ /……内核AppKernel (“刺激”);内核->loadClassCache ();//添加(或取消注释)这个新行!//将默认的AppKernel包装成AppCache内核内核AppCache (内核);请求=请求::createFromGlobals ();/ /……

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

谨慎

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

提示

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

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

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

12 3 4 5 6 7 8 9 10 11 12 13
/ / app / AppCache.php使用欧宝娱乐app下载地址FrameworkBundleHttpCacheHttpCacheAppCache扩展HttpCache{受保护的函数getOptions(){返回数组“default_ttl”= >0/ /……);}}

有关选项及其含义的完整列表,请参见HttpCache: __construct()的欧宝体育电话文档

当您处于调试模式时(无论是因为您的引导调试内核,比如app_dev.php您可以手动设置调试选项为true), Symfony欧宝娱乐app下载地址会自动添加一个X-欧宝娱乐app下载地址Symfony-Cache头指向响应。使用它来获取缓存命中和未命中的信息。

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

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

使你的响应HTTP可缓存

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

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

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

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

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

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

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

过期的缓存

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / AppBundle /控制器/ BlogController.php使用欧宝娱乐app下载地址组件HttpFoundation响应/ /……公共函数indexAction(){//以某种方式创建一个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反向代理,请欧宝娱乐app下载地址查看X-欧宝娱乐app下载地址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缓存条目是非常有用的。

详细信息请参见缓存失效

使用边缘包含

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

总结

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

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