缓存提高性能
CDN一个>在边缘缓存以获得更好的性能。
让我们缓存主页一个小时:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33,9 +33,12 @@ class ConferenceController extends AbstractController #[路由('/',名称:'主页')]公共函数索引(ConferenceRepository $ ConferenceRepository): Response {-返回新的响应($this->twig->渲染('conference/index.html。嫩枝”,(+ $response = new response ($this->twig->render('conference/index.html。嫩枝”,('conference ' => $conferenceRepository->findAll(),]));+ $响应- > setSharedMaxAge (3600);++返回$response;} #(路线(“/会议/{蛞蝓}”,名字:“会议”))
的setSharedMaxAge ()
方法为反向代理配置缓存过期。使用setMaxAge ()
来控制浏览器缓存。时间单位为秒(1小时= 60分钟= 3600秒)。
缓存会议页面更具挑战性,因为它更加动态。任何人都可以在任何时候添加评论,没有人愿意等一个小时才能在网上看到它。在这种情况下,使用HTTP验证策略。
让我们缓存主页一个小时:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33,9 +33,12 @@ class ConferenceController extends AbstractController #[路由('/',名称:'主页')]公共函数索引(ConferenceRepository $ ConferenceRepository): Response {-返回新的响应($this->twig->渲染('conference/index.html。嫩枝”,(+ $response = new response ($this->twig->render('conference/index.html。嫩枝”,('conference ' => $conferenceRepository->findAll(),]));+ $响应- > setSharedMaxAge (3600);++返回$response;} #(路线(“/会议/{蛞蝓}”,名字:“会议”))
的setSharedMaxAge ()
方法为反向代理配置缓存过期。使用setMaxAge ()
来控制浏览器缓存。时间单位为秒(1小时= 60分钟= 3600秒)。
缓存会议页面更具挑战性,因为它更加动态。任何人都可以在任何时候添加评论,没有人愿意等一个小时才能在网上看到它。在这种情况下,使用HTTP验证策略。
除了是一个成熟的HTTP反向代理之外,Symfony HTTP反向代理(通过ob娱乐下载HttpCache
class)添加了一些不错的调试信息作为HTTP头。这对验证我们设置的缓存头有很大帮助。
在主页上查看:
1
$curl -s -I -X GET https://127.0.0.1:8000/
1 2 3 4 5 6 7 8 9 10 11
HTTP/2 200 age: 0 cache-control: public, s-maxage=3600 content-type: text/html;charset=UTF-8 date: Mon, 28 Oct 2019 08:11:57 GMT x-content-digest: en63cef7045fe418859d73668c2703fb1324fcc0d35b21d95369a9ed1aca48e73e x-debug-token: 9eb25a x-debug-token-link: https://127.0.0.1:8000/_profiler/9eb25a x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: miss, store content-length: 50978
对于第一个请求,缓存服务器告诉您它是一个小姐
它执行了商店
缓存响应。检查cache - control
头查看已配置的缓存策略。
对于后续的请求,响应将被缓存年龄
也已更新):
1 2 3 4 5 6 7 8 9 10 11
HTTP/2 200 age: 143 cache-control: public, s-maxage=3600 content-type: text/html;charset=UTF-8 date: Mon, 28 Oct 2019 08:11:57 GMT x-content-digest: en63cef7045fe418859d73668c2703fb1324fcc0d35b21d95369a9ed1aca48e73e x-debug-token: 9eb25a x-debug-token-link: https://127.0.0.1:8000/_profiler/9eb25a x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: fresh content-length: 50978
TwigEventSubscriberlistener在Twig中注入一个包含所有会议对象的全局变量。它对网站的每一页都这样做。这可能是一个很好的优化目标。
您不会每天添加新的会议,因此代码会一遍又一遍地从数据库中查询完全相同的数据。
我们可能希望使用Symfony缓存缓存会议名称和蛞蝓,但只要可能,我喜欢依赖HTTP缓存基础设施。ob娱乐下载
当您希望缓存页面的某个片段时,可以通过创建对象将其移到当前HTTP请求之外sub-request.应急服务国际公司是此用例的完美匹配。ESI是一种将HTTP请求的结果嵌入到另一个请求中的方法。
创建一个只返回显示会议的HTML片段的控制器:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@类ConferenceController扩展AbstractController返回$response;}+ #[路由('/conference_header',名称:'conference_header')]+公共功能conferenceHeader(ConferenceRepository $ ConferenceRepository):响应+ {+返回新的响应($this->twig->render('conference/header.html. html. '嫩枝”,(+ 'conference ' => $conferenceRepository->findAll(),+)));+}+#[路由('/conference/{slug}',名称:'conference')]公共功能显示(请求$请求,会议$会议,CommentRepository $ CommentRepository,字符串$photoDir):响应{
创建相应的模板:
打击/ conference_header
检查一切是否正常。
是时候揭晓诀窍了!更新Twig布局来调用我们刚刚创建的控制器:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -16,11 +16,7 @@<身体> <标题> < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >——< ul >-{%用于会议中的会议%}- {{conference}} .- {% endfor %}- < / ul >+ {{render(path('conference_header'))}}
{% block body %}{% endblock %}
和瞧.刷新页面,网站仍然显示相同的内容。
提示
使用“请求/响应”Symfony分析器面板了解关于主请求及ob娱乐下载其子请求的更多信息。
现在,每当您在浏览器中点击一个页面时,就会执行两个HTTP请求,一个用于标头,一个用于主页面。你把业绩弄得更糟了。恭喜你!
会议头HTTP调用目前由Symfony内部完成,因此不涉及HTTP往返。ob娱乐下载这也意味着无法从HTTP缓存头中获益。
使用ESI将调用转换为“真正的”HTTP调用。
首先,启用ESI支持:
1 2 3 4 5 6 7 8 9 10 11
——/ config /包/ framework.yaml+ + + b / config /包/ framework.yaml@@ -12,7 +12,7 @@ framework: cookie_samesite: lax storage_factory_id: session.storage.factory.native- #esi: true+ esi: true# php_errors: log: true
然后,用render_esi
而不是渲染
:
1 2 3 4 5 6 7 8 9 10 11
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -16,7 +16,7 @@<身体> <标题> < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >- {{render(path('conference_header'))}}+ {{render_esi(path('conference_header'))}}
{% block body %}{% endblock %}
如果Sob娱乐下载ymfony检测到反向代理知道如何处理ESIs,它就会自动启用支持(如果不支持,它就会退回到同步呈现子请求)。
由于Symfoob娱乐下载ny反向代理确实支持ESIs,让我们检查一下它的日志(首先删除缓存-参见下面的“清除”):
1
$curl -s -I -X GET https://127.0.0.1:8000/
12 3 4 5 6 7 8 9 10 11 12
HTTP/2 200时代:0缓存控制:必须重新验证,没有缓存,私有内容类型:文本/html;charset=UTF-8 date: Mon, 28 Oct 2019 08:20:05 GMT expires: Mon, 28 Oct 2019 08:20:05 GMT x-content-digest: en4dd846a34dcd757eb9fd277f43220effd28c00e4117bed41af7f85700eb07f2c x-debug-token: 719a83 x-debug-token-link: https://127.0.0.1:8000/_profiler/719a83 x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: miss, store;GET /conference_header: miss content-length: 50978
刷新几次:/
响应被缓存/ conference_header
一个不是。我们已经实现了一些伟大的东西:整个页面都在缓存中,但仍然有一部分是动态的。
但这不是我们想要的。缓存头页一个小时,独立于其他所有事情:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ - 444,9 + 444,12 @@ class ConferenceController extends AbstractController #[路由('/conference_header',名称:'conference_header')]公共函数conferenceHeader(ConferenceRepository $ ConferenceRepository): Response {-返回新的响应($this->twig->渲染('conference/header.html. html。嫩枝”,(+ $response = new response ($this->twig->render('conference/header.html. html。嫩枝”,('conference ' => $conferenceRepository->findAll(),]));+ $响应- > setSharedMaxAge (3600);++返回$response;} #(路线(“/会议/{蛞蝓}”,名字:“会议”))
缓存现在为两个请求启用:
1
$curl -s -I -X GET https://127.0.0.1:8000/
1 2 3 4 5 6 7 8 9 10 11
HTTP/2 200 age: 613 cache-control: public, s-maxage=3600 content-type: text/html;charset=UTF-8 date: Mon, 28 Oct 2019 07:31:24 GMT x-content-digest: en15216b0803c7851d3d07071473c9f6a3a3360c6a83ccb0e550b35d5bc484bbd2 x-debug-token: cfb0e9 x-debug-token-link: https://127.0.0.1:8000/_profiler/cfb0e9 x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: fresh;GET /conference_header: fresh content-length: 50978
的x-ob娱乐下载symfony-cache
页眉包含两个元素:main/
请求和子请求conference_header
应急服务国际公司)。两者都在缓存中(新鲜的
).
缓存策略可以不同于主界面和主界面对应的ESIs。如果我们有一个“关于”页面,我们可能希望在缓存中存储它一周,并且每小时更新一次标题。
删除监听器,因为我们不再需要它了:
1
$rm src / EventSubscriber / TwigEventSubscriber.php
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@类ConferenceController扩展AbstractController返回$response;}+ #[路由('/conference_header',名称:'conference_header')]+公共功能conferenceHeader(ConferenceRepository $ ConferenceRepository):响应+ {+返回新的响应($this->twig->render('conference/header.html. html. '嫩枝”,(+ 'conference ' => $conferenceRepository->findAll(),+)));+}+#[路由('/conference/{slug}',名称:'conference')]公共功能显示(请求$请求,会议$会议,CommentRepository $ CommentRepository,字符串$photoDir):响应{
/ conference_header
检查一切是否正常。12 3 4 5 6 7 8 9 10 11 12 13 14 15
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -16,11 +16,7 @@<身体> <标题> < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >——< ul >-{%用于会议中的会议%}- {{conference}} .- {% endfor %}- < / ul >+ {{render(path('conference_header'))}}
{% block body %}{% endblock %}
提示
使用“请求/响应”Symfony分析器面板了解关于主请求及ob娱乐下载其子请求的更多信息。
1 2 3 4 5 6 7 8 9 10 11
——/ config /包/ framework.yaml+ + + b / config /包/ framework.yaml@@ -12,7 +12,7 @@ framework: cookie_samesite: lax storage_factory_id: session.storage.factory.native- #esi: true+ esi: true# php_errors: log: true
render_esi
而不是渲染
:1 2 3 4 5 6 7 8 9 10 11
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -16,7 +16,7 @@<身体> <标题> < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >- {{render(path('conference_header'))}}+ {{render_esi(path('conference_header'))}}
{% block body %}{% endblock %}
1
$curl -s -I -X GET https://127.0.0.1:8000/
12 3 4 5 6 7 8 9 10 11 12
HTTP/2 200时代:0缓存控制:必须重新验证,没有缓存,私有内容类型:文本/html;charset=UTF-8 date: Mon, 28 Oct 2019 08:20:05 GMT expires: Mon, 28 Oct 2019 08:20:05 GMT x-content-digest: en4dd846a34dcd757eb9fd277f43220effd28c00e4117bed41af7f85700eb07f2c x-debug-token: 719a83 x-debug-token-link: https://127.0.0.1:8000/_profiler/719a83 x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: miss, store;GET /conference_header: miss content-length: 50978
/
响应被缓存/ conference_header
一个不是。我们已经实现了一些伟大的东西:整个页面都在缓存中,但仍然有一部分是动态的。12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ - 444,9 + 444,12 @@ class ConferenceController extends AbstractController #[路由('/conference_header',名称:'conference_header')]公共函数conferenceHeader(ConferenceRepository $ ConferenceRepository): Response {-返回新的响应($this->twig->渲染('conference/header.html. html。嫩枝”,(+ $response = new response ($this->twig->render('conference/header.html. html。嫩枝”,('conference ' => $conferenceRepository->findAll(),]));+ $响应- > setSharedMaxAge (3600);++返回$response;} #(路线(“/会议/{蛞蝓}”,名字:“会议”))
1
$curl -s -I -X GET https://127.0.0.1:8000/
1 2 3 4 5 6 7 8 9 10 11
HTTP/2 200 age: 613 cache-control: public, s-maxage=3600 content-type: text/html;charset=UTF-8 date: Mon, 28 Oct 2019 07:31:24 GMT x-content-digest: en15216b0803c7851d3d07071473c9f6a3a3360c6a83ccb0e550b35d5bc484bbd2 x-debug-token: cfb0e9 x-debug-token-link: https://127.0.0.1:8000/_profiler/cfb0e9 x-robot -tag: noindex x-ob娱乐下载 symfy -cache: GET /: fresh;GET /conference_header: fresh content-length: 50978
x-ob娱乐下载symfony-cache
页眉包含两个元素:main/
请求和子请求conference_header
应急服务国际公司)。两者都在缓存中(新鲜的
).1
$rm src / EventSubscriber / TwigEventSubscriber.php
请注意
你可以用:命令
创建命令。
1
$ob娱乐下载Symfony控制台制作:命令应用:一步:信息
如果我们想要缓存输出几分钟呢?使用Symfonob娱乐下载y缓存。
然后用缓存逻辑包装代码:
12 34 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 34 35 36 37
——/ src /命令/ StepInfoCommand.php+ + + b / src /命令/ StepInfoCommand.php@@ -6,16 +6,31 @@使用Symob娱乐下载fony\组件\控制台\命令\命令;使用Syob娱乐下载mfony \ \控制台输入\ \ InputInterface组件;使用Syob娱乐下载mfony \组件\ \控制台输出\ OutputInterface;使用Syob娱乐下载mfony \组件\ \过程;+使用Syob娱乐下载mfony \ \缓存\ CacheInterface合同;class StepInfoCommand extends Command {protected static $defaultName = 'app:step:info';+ private $cache;++公共函数__construct(CacheInterface $cache)+ {+ $this->cache = $cache;++父:__construct ();+}+执行(InputInterface $input, OutputInterface $output): int {- $ = new过程([“git”、“标签”,“- l”,“——点”,“头”));-过程- > mustRun ();-输出- >写美元(美元过程- > getOutput ());+ $step = $this->cache->get('应用程序。函数($item) {+ $ = new过程([“git”、“标签”,“- l”,“——点”,“头”));+ $流程- > mustRun ();+ $ item - > expiresAfter (30);++ $process->getOutput();+});+输出美元- > writeln($步骤);返回0;}
过程现在只在app.current_step
项不在缓存中。
使用清漆作为路线的主要入口点:
1 2 3 4 5 6
——/ .platform / routes.yaml+ + + b / .platform / routes.yaml@@ -1,2 +1,2 @@——“https://{} /”:{类型:上游,上游:“应用:http”}+"https://{all}/": {type: upstream, upstream: "varnish:http", cache: {enabled: false}}“http://{} / ":{类型:重定向,:“https://{} /”}
最后,创建一个config.vcl
配置Varnish的文件: