缓存提高性能

除了是一个成熟的HTTP反向代理之外,Symfony HTTP反向代理(通过ob娱乐下载HttpCacheclass)添加了一些不错的调试信息作为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):响应{

创建相应的模板:

模板/会议/ header.html.twig
1 2 3 4 5
<ul>{%会议中的会议%}<><一个href{{path('conference',{蛞蝓:会议。Slug})}}>{{conference}}一个>>{%endfor%}ul>

打击/ conference_header检查一切是否正常。

是时候揭晓诀窍了!更新Twig布局来调用我们刚刚创建的控制器:

.刷新页面,网站仍然显示相同的内容。

提示

使用“请求/响应”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

var /缓存/ dev / http_cache /目录:

1
Rm -rf var/cache/dev/http_cache/

如果您只想使某些url失效,或者您想在功能测试中集成缓存失效,则此策略不太适用。让我们添加一个小的,只有管理员的HTTP端点来使一些url无效:

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
——/ config / services.yaml+ + + b / config / services.yaml@@ -36,3 +36,5 @@服务:标签:- {name: 'doctrine.orm. 'entity_listener',事件:'prePersist',实体:'App\ entity \Conference'} - {name: 'doctrine.orm. 'entity_listener',事件:'preUpdate',实体:'App\ entity \Conference'}++ ob娱乐下载Symfony\Component\HttpKernel\ httpache \StoreInterface: '@http_cache.store'——/ src /控制器/ AdminController.php+ + + b / src /控制器/ AdminController.php@@ -8,6 +8,8使用Doctrine\ORM\EntityManagerInterface;控制器使ob娱乐下载用Symfony \包\ FrameworkBundle \ \ AbstractController;使用Syob娱乐下载mfony \ HttpFoundation \ \组件请求;组件使用ob娱乐下载Symfony \ \ HttpFoundation \反应;+使用Syob娱乐下载mfony \组件\ HttpKernel \ HttpCache \ StoreInterface;+使用Syob娱乐下载mfony \ \ HttpKernel \ KernelInterface组件;使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;使用Syob娱乐下载mfony \组件\路由\注释\路线;使用Syob娱乐下载mfony \工作流组件\ \注册;@@ -52,4 +54,16 @@类AdminController extends AbstractController 'comment' => $comment,]))}++ #(路线(' / admin / http缓存/ {< uri。*>}',方法:['PURGE'])]+公共函数purgehttcache (KernelInterface $kernel, Request $ Request, string $uri, StoreInterface $store): Response+ {+ if ('prod' === $kernel->getEnvironment()) {+返回新的响应('KO', 400);+}++ $存储- >清除(请求- > getSchemeAndHttpHost()。‘/’。美元uri);++返回新的响应('Done');+}

新的控制器被限制在清洗HTTP方法。此方法不在HTTP标准中,但它被广泛用于使缓存无效。

缺省情况下,路由参数不能包含/因为它分离URL段。您可以为最后一个路由参数重写此限制,例如uri,通过设置您自己的需求模式(. *).

我们得到HttpCache实例看起来也有点奇怪;我们使用匿名类,因为访问“真实”类是不可能的。的HttpCache实例包装了真正的内核,它不知道缓存层的存在。

通过以下cURL调用使主页和会议标题无效:

1 2
curl -s -I -X PURGE -u admin:admin 'ob娱乐下载 symfony var:出口ob娱乐下载SYMFONY_PROJECT_DEFAULT_ROUTE_URL / admin / http缓存/curl -s -I -X PURGE -u admin:admin 'ob娱乐下载 symfony var:出口ob娱乐下载SYMFONY_PROJECT_DEFAULT_ROUTE_URL ' / admin / http缓存/ conference_header

ob娱乐下载symfony var:导出SYMFONY_PROJECT_DEFAULT_ROUTE_URL子命令返回本地web服务器的当前URL。

请注意

控制器没有路由名,因为它永远不会在代码中被引用。

请注意

你可以用:命令创建命令。

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的文件:

.platform / config.vcl
1 2 3
Sub vcl_recv {要求的事情。Backend_hint = application.backend();}

主分支。如果您需要经常清除缓存,这可能意味着应该调整缓存策略(通过降低TTL或使用验证策略而不是过期策略)。

不管怎样,让我们看看如何配置Varnish缓存失效:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ .platform / config.vcl+ + + b / .platform / config.vcl@@ -1,6 +1,13 @@Sub vcl_recv {set req。Backend_hint = application.backend();设置req.http。代理能力= "abc=ESI/1.0";++ if (req;方法== "清除"){+ if (req.http。x- purge_token != "PURGE_NOW") {+返回(synth (405));+}+返回(清除);+}} sub vcl_backend_response {

在实际生活中,您可能会受到ip的限制,而不是像描述的那样<一个href="https://varnish-cache.org/docs/trunk/users-guide/purging.html" class="reference external" rel="external noopener noreferrer" target="_blank">清漆文档

现在清除一些url:

1 2
curl -X PURGE -H“x-purge-token: PURGE_NOW”'ob娱乐下载 sob直播appymfony cloud:env:url——pipe——primary 'curl -X PURGE -H“x-purge-token: PURGE_NOW”'ob娱乐下载 sob直播appymfony cloud:env:url——pipe——primary ' conference_header

url看起来有点奇怪,因为返回的urlenv: url已经以/

此工作,包括代码示例,是根据<一个rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">知识共享协议BY-NC-SA 4.0许可证。