HTTP缓存
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。
读本页的更新版本用于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那样是一个功能齐全的反向代理缓存,但这是一个很好的开始。
提示
有关设置清漆的详细信息,请参见如何使用清漆来加快我的网站.
每个应用程序都有一个缓存内核(AppCache
),它封装了默认的(AppKernel
).缓存内核是反向代理。
要启用缓存,请修改前端控制器的代码。您还可以对app_dev.php
控件中添加缓存dev
环境:
12 3 4 5 6 7 8 9 10 11 12 13
/ /网络/ app.php使用ob娱乐下载\组件\HttpFoundation\请求;/ /……$内核=新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使用ob娱乐下载\包\FrameworkBundle\HttpCache\HttpCache;类AppCache扩展HttpCache{受保护的函数getOptions(){返回[“default_ttl”=>0,/ /……];}}
有关选项及其含义的完整列表,请参见HttpCache: __construct()的欧宝官网下载app文档.
当您处于调试模式时(无论是因为您的引导调试
内核,比如app_dev.php
或您可以手动设置调试
选项为true), Symfonyob娱乐下载会自动添加一个X-ob娱乐下载Symfony-Cache
头指向响应。使用它来获取缓存命中和未命中的信息。
从一个反向代理更改到另一个
Symfob娱乐下载ony反向代理是一个很好的工具,当你开发你的网站,或者当你部署你的网站到一个共享主机,你不能安装除PHP代码以外的任何东西。但是由于它是用PHP编写的,所以速度不如用C编写的代理。
幸运的是,由于所有反向代理实际上都是相同的,因此您应该能够切换到更健壮的东西——比如Varnish——而不会出现任何问题。看到如何使用清漆
使你的响应HTTP可缓存
一旦添加了反向代理缓存(例如Symfony反向代理或Varnish),就可以缓存响应了。ob娱乐下载要做到这一点,你需要沟通到你的缓存哪一个响应是可缓存的,以及缓存多长时间。这是通过在响应上设置HTTP缓存头来实现的。
HTTP指定了四个响应缓存头,您可以设置为启用缓存:
cache - control
到期
ETag
last - modified
这四个头是用来帮助缓存您的响应通过两个不同的模型:
阅读HTTP规范
您将读到的所有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 / AppBundle /控制器/ BlogController.php使用ob娱乐下载\组件\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反向代理,请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,]);
总结
ob娱乐下载Symfony的设计遵循了经过验证的规则:HTTP。缓存也不例外。掌握Symfony缓存系统意ob娱乐下载味着熟悉HTTP缓存模型并有效地使用它们。这意味着,您不再仅仅依赖于Symfony文档和代码示例,而是可以访问与HTTP缓存和网关ob娱乐下载缓存(如Varn欧宝官网下载appish)相关的大量知识。