性能缓存

1 2 3 4 5 6 7 8 9 10
——/ config /包/ framework.yaml+ + + b / config /包/ framework.yaml@@ -22,3 +22,7 @@ when@test: test: true session: storage_factory_id: session.storage.factory.mock_file++ when@dev:+框架:+ http_cache: true

Der ob娱乐下载Symfony HTTP-Reverse-Proxy (über die . exeHttpCache-Klasse) ist nicht nur ein vollwertiger HTTP-Reverse-Proxy, sondern fügt auch einige nützliche Debug-Informationen als HTTP-Header hinzu。缓存头。

Überprüfe es auf der主页:

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

Für den allerersten请求缓存服务器目录小姐Handelt und dass er商店ausführte,嗯die响应zu cachen。Uberprufe窝cache - control-头,嗯die konfigurierte Cache Strategie zu sehen。

Für nachfolgende请求ist die响应im缓存(年龄(德国)

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

TwigEventSubscriber-Listener injiziert eine global Variable mit allen Konferenzobjekten in Twig。Dies geschieht für jede einzelne Seite der website。Das ist wahrscheinlich ein großer Optimierungspunkt。

Du wirht jeden Tag neue Konferenzen hinzufügen, sodass der Code immer wieder genau die gleichen Daten ausder Datenbank abfragt。

Wir möchten vielleicht die Konferenznamen und Slugs mit dem ob娱乐下载Symfony Cache zwischenspeichern。Ich verlasse michigan jedoch, wann immer es möglich ist, auf die http - caching - infrastrucktur。

要是Du静脉段静脉Seite zwischenspeichern想,verschiebe es来自民主党aktuellen http请求,indem Du杯Sub-Requesterstellst。应急服务国际公司ist die perfeckte Ergänzung zu diesem Anwendungsfall。Ein ESI ist eine Möglichkeit, das Ergebnis einer HTTP-Anfrage in eine andere einzubetten。

Erstelle einen Controller, der nur das HTML-Fragment zurückgibt, welches die Konferenzen anzeigt:

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):响应{

Erstelle das entsprecende模板:

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

Rufe/ conference_headerim浏览器auf,嗯zu überprüfen, ob alles in Ordnung ist。

Zeit, den Trick zu enthüllen!Aktualisiere das树枝模板,um den soeben erstellten控制器aufzurufen:

.阿克图阿利西埃尔死在那里和你的时间就在那里。

提示

Verwende das ob娱乐下载Symfony分析器-面板“请求/响应”,um mehr über den主请求和塞纳子请求zu erfahren。

修女werden bei jedem Aufruf einer Seite im Browser zwei HTTP-Requests ausgeführt, einer für den Header und einer für die Hauptseite。杜有模具性能。衷心祝贺!

Der Konferenz头http请求奇怪的derzeit实习生冯Symfony durchgeführt,所以dob娱乐下载ass kein http -往返erforderlich ist。die bedeutet auch, dass es keine Möglichkeit gibt, von HTTP-Cache-Headern zu profitieren。

Konvertiere den Request in einen "echten" HTTP-Request mit Hilfe von ESI。

Aktiviere zunächst den ESI-Support:

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

Verwenderender_esianstelle冯渲染

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 %}

Wenn ob娱乐下载Symfony einen反向代理错误,der mit umgehen kann, aktiviert es den ESI-Support自动完成(Wenn niht, greift es auf渲染zurück,恩登子请求同步auszuführen)。

Da der ob娱乐下载Symfony反向代理ESIs unterstützt, sollten wir seine Logs überprüfen (zuerst den Cache entfernen - siehe“Purging”unten):

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

Aktualisiere die Seite einige男:死/-回应鸟zwischengespeichert und die/ conference_header反应不。Wir haben etwas Großartiges erreicht: Wir haben die ganze Seite im Cache, aber ein Teil ist immer noch dynamisch。

Das ist aber nicht Das,是wir wollen。缓存模具头- seite für eine Stunde, unabhängig von allem anderen:

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;} #(路线(“/会议/{蛞蝓}”,名字:“会议”))

Der Cache ist nun für beide请求aktiviert:

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

Derx-ob娱乐下载symfony-cache-Header enthält zwei Elemente: den主请求/子请求(denconference_header应急服务国际公司)。Beide befinden sich im Cache (新鲜的).

Cache-Strategie kann sich von der Hauptseite and ihren isunterscheiden。Wenn wir eine "Über"-Seite haben, möchten wir sie vielleicht für eine Woche im Cache speichern und trotzdem den Header jede Stunde aktualisieren lassen。

Entferne den Listener, da wir ihn niht mehr benötigen:

1
rm src / EventSubscriber / TwigEventSubscriber.php

var /缓存/ dev / http_cache /-Verzeichnis entfernst:

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

Diese Strategie funktioniert nht gut, wenn Du nur einige url invalidieren将在Deine Funktionalen测试积分将。Lass uns einen kleinen HTTP-Endpunkt nur für管理员*innen hinzufügen, um einige url zu invalidieren:

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-Methode beschrankt。Diese Methode ist nicht im HTTP-Standard enthalten, wid aber häufig verwendet, um Caches zu invalidieren。

Standardmäßig können Routenparameter kein/-Zeichen enthalten, da es URL-Segmente trennt。Du kannst diese Einschränkung für den letzten Routenparameter, hier beispielsweiseuri, überschreiben, indem Du für ihn ein eigenes需求-模式(.*) festlegst。

艺术与智慧并存,我们终将死去HttpCache-Instanz erhalten, mag etwas seltsam wirken;匿名的klase, dader Zugriff auf die " ecte " klase nicht möglich ist。死HttpCache-Instanz umschließt den echten Kernel, welcher den Cache-Layer nicht kennt,是genau so sein sollte。

Invalidiere die首页und den Konferenz-Header mittels folgender cURL-Aufrufe:

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

Derob娱乐下载symfony var:导出SYMFONY_PROJECT_DEFAULT_ROUTE_URL-Unterbefehl gibt die aktuelle URL des lokalen Webservers zurück。

请注意

Der Controller hat keinen Routennamen, da er im Code nie referenziert werden wild。

请注意

杜的帽子:命令nutzen können,嗯den Befehl zu erstellen:

1
ob娱乐下载Symfony控制台制作:命令应用:一步:信息

是,wenn wir die Ausgabe für ein paar Minuten cachen wollen?Verwende den ob娱乐下载Symfony Cache。

Und umschließe den Code mit der Cache-Logik:

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;}

Der Prozess wnun nuch aufgerufen, wenn sich dasapp.current_step-Element nicht im Cache befindet。

主分支。Wenn Du den Cache häufig leeren musst, bedeutet dies wahrscheinlich, dass die Cache - strategie optimiert werden sollte (durch Senkung der TTL oder durch Verwendung einer Validierungsstrategie anstelle einer Ablaufstrategie)。

这是一种清漆für这是一种不值得珍藏的东西:

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 {

Im wirklichen Leben würdest du das wahrscheinlich auf bestimmte ip einschränken, wie in der<一个href="https://varnish-cache.org/docs/trunk/users-guide/purging.html" class="reference external" rel="external noopener noreferrer" target="_blank">清漆Dokumentationbeschrieben。

清除jetzt einige 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

Die url sehen etwas seltsam aus, da Die vonenv: urlzurückgegebenen url bereits mit/enden。

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