缓存per le prestazioni

反向代理HTTP,反向代理HTTP di Symfony (tramite la libreria)ob娱乐下载HttpCache) aggiunge alcune informazioni di debug忽略头HTTP。我想说的是,我想说的是,我想说的是,我想说的是。

Controlliamo l 'homepage:

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

Durante la prima richiesta, il server di cache ci informa che non ha trovato la risposta nella cache (小姐e ha memorizzato (商店) la risposta nella cache。控制器l' ntestazione HTTP chiamatacache - control根据战略战略,缓存配置。

Nelle richhieste, le risposte vengono prese dalla cache年龄è stato aggiornato):

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

TwigEventSubscriberaggiunge una variable globale在Twig con tutti gli oggetti conferenza。我要你吃我的肉。概率是必然的。

非si aggiungonve nouove会议ogni giorno, quindi codice审问gli stentii数据数据库più e più volte。

Potremmo voler mettere in cache i nomi e gli slug delle conference con la cache di ob娱乐下载Symfony, ma quando可能的mi place fare affidamento sull' infrastructure uttura di cache HTTP。

在那pagina的框架下,在那富饶的土地上,在那富饶的土地上sotto-richiesta.Per questo caso d'uso应急服务国际公司è la soluzione perfetta。ESI è un modo per corporare il risultato di una rich esta HTTP in un'altra。

Creiamo un controller che restituisce solo il frammento HTML che visualizza le conference:

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

Creiamo il模板函件:

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

Apriamo/ conference_header每个人都有自己的归属。

È ora di svelare il trucco!Aggiorniamo il layout Twig per chiamare il controller che abbiamo appena creato:

E.Aggiorniamo la pagina e il sito continuerà一个最珍贵的信息。

提示

Usiamo il pannello“请求/响应”del Profiler di Symfony per sapob娱乐下载erne di più一个富有的人。

Ora, ogni volta che si raggiunge una pagina nel browser vengono eseguite due rich este HTTP: una per l' ntestazione e una per la pagina principale。Abbiamo peggiorato le prestazioni。Congratulazioni !

La chiamata HTTP all' testazione della conferenza è attualmente effettuata international da ob娱乐下载Symfony, quindi non è previsto alcun往返HTTP。Questo significa anche che non c'è modo di beneficiare degli头della缓存HTTP。

转换拉chiamata在una chiamata HTTP“real”利用ESI。

在primo luogo, attiviamo il support to 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

篇,utilizziamorender_esiAl posto di渲染

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

Se ob娱乐下载Symfony rileva un反向代理che sa come trattare gli ESI, abilita automaticamente il support(在caso contrario, ritorna al render sincrono della richiesta secondaria)。

Poiché il反向代理di Symfony supob娱乐下载porta ESI, controlliamo i suoi log (rimuoviamo prima la cache, si veda la sezione“Pulizia”più avanti):

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

Aggiorniamo qualche volta la pagina: la risposta relativa al percorso/è在缓存中的拯救,相对而言是可以补救的/ conference_headerNon lo è。Abbiamo ottenuto un grande risultato: l'intera pagina è in cache, ma una sua parte è ancora dinamica。

Ma non è quello che vogliamo。Manteniamo in cache la pagina di ntestazione per un'ora, independence da tutto il resto:

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

La cache è ora abilitata per entrambe le richieste:

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

L 'intestazionex-ob娱乐下载symfony-cache要素连续性:富有的原则/e una richhiesta secondaria (l’esiconference_header).缓存中的声纳(新鲜的).

秘密战略può秘密秘密,秘密秘密,秘密秘密。“关于”,“关于”的诗,“关于”的诗。

Rimuoviamo il listener, non ne abbiamo più bisogno:

1
rm src / EventSubscriber / TwigEventSubscriber.php

var /缓存/ dev / http_cache /:

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

问题战略,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌,无真菌。Aggiungiamo un piccolo endpoint HTTP, solo per l'amministrazione, per invalidare alcuni 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', event: 'prePersist', entity: 'App\Entity\Conference'} - { name: 'doctrine.orm.entity_listener', event: 'preUpdate', entity: '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');+}

Il nuovo控制器è statto limitato al metodo HTTP清洗.Questo metodo non fa fa partte dello标准HTTP, ma è ampiamente usato per invalidare le cache。

根据预先定义的假名,我的参数,没有所有的权利/, visto che funge da separatore忽略URL。È可能的sovrascriere questa stristrizione per l'ultimo parameter Della rotta, comeuri,不真实的lo schema dei requisiti.*).

在我的故乡HttpCachePuò阳光普照斯特拉诺;Stiamo usando una class anonima perché l'accesso a quella“real”非è可能。L 'istanza迪HttpCacheAvvolge il kernel reale che, come è giusto che sia, non è a conoscenza del livello di cache。

Invalidiamo la首页el ' ntestazione della conferenza tramite le seguenti chiamate卷曲:

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

Il第一ob娱乐下载symfony var:导出SYMFONY_PROJECT_DEFAULT_ROUTE_URLrestituisce l'URL corrente del server web locale。

请注意

Il controller non ha un nome di rotta, in quanto non sarà mai menzionato nel codice。

请注意

Avremmo potuto usare:命令Per creare il comando:

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

在每隔一分钟的缓存输出中有多少volessimo metrere ?Usiamo il componente Cache di ob娱乐下载Symfony。

E aggiungiamo la logica della cache al codice:

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

Il processo è ora richiamato solo se l'elementapp.current_step缓存中没有è。

使用清漆来punto di ingresso principale nelle rotte:

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://{} /”}

Infine, creiamo un file di configurazioneconfig.vcl每清漆:

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

主.Se è必要的,必须的,有意义的,有价值的战略,有价值的,有价值的战略,有价值的,有价值的战略,有价值的,有价值的战略,有价值的,有价值的战略。

在ogni caso, vediamo come configurare Varnish per invalidare la cache:

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 {

Nella vita real, probability utilitzzeremo limitazioni sulla base dell'indirizzo IP, come critto Nella<一个href="https://varnish-cache.org/docs/trunk/users-guide/purging.html" class="reference external" rel="external noopener noreferrer" target="_blank">documentazione di Varnish

Ora invalidiamo alcuni网址:

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

Gli URL sembrano un po' strani, poiché quelli restituiti daenv: urlFiniscono già con/

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