Twig: përshpejtoni gjenerimin e shablloneve të tij
Ueb agjenci » Lajme dixhitale » Twig: përshpejtoni gjenerimin e shablloneve të tij

Twig: përshpejtoni gjenerimin e shablloneve të tij

Kohët e fundit, i kërkova vetes të reflektoja mbi zgjidhjet e ofruara nga Twig për të hyrë në vetitë e një objekti ose një grupi.

Qasja në një veti të një objekti

Twig u krijua për të thjeshtuar shabllonet tona, si në aspektin e kodit ashtu edhe në aspektin e pastërtisë. Ai u krijua gjithashtu për të lejuar integruesit, njerëzit që jo të gjithë kanë njohuri zhvillimi, akses të lehtë në vetitë e një objekti ose të tjerë. Kjo falë një sintakse të thjeshtuar.

Vetëm atëherë, duke qenë një zhvillues mbi të gjitha, i bëra vetes pyetjen se si po bënte twig për të përcaktuar se cila metodë e një objekti duhet të quhet.

Sintaksa e thuprës

Në kodin tim të mëposhtëm do të supozoj se po përdor një klasë si më poshtë.

1
2
3
4
5
6
7
8
9
10
11
12
13
klasë Objekt
{
privat $Emri;
publik $emri i përdoruesit;
publik funksion merrniName() {
kthim $ kjo-> emri;
}
publik funksion merrni emrin e përdoruesit() {
kthim $ kjo->emri i përdoruesit;
}
}

Kështu do ta quaj shabllonin tim nga një kontrollues Symfony.

1
2
3
publik funksion indeksVeprimi() {
kthim grup("Objekt" => $objekt);
}

Deri më tani, gjithçka është e qartë. Objekti im duket tamam si objektet që mund të përdor në projektet e mia.

Analizimi i deklaratave në Twig

1
{{ object.name }}

Tani e tutje do të shohim se si funksionon Twig me thirrjet tona. Këtu, i kërkojmë Twig të marrë vlerën emër e objektit tim, përveç se për Twig që është vetëm një thirrje e thjeshtë PHP në fund, kjo ndryshore është e paarritshme. Prandaj, Twig ka shtuar një përfaqësues për të përmbledhur dhe për të parë se cilat veçori dhe metoda janë të disponueshme.

Prandaj, Twig do të kërkojë në rendin e mëposhtëm të bëjë kontrolle mbi objektin.

  1. Shihni nëse objekt është një varg dhe nëse emër është një çelës;
  2. Shihni nëse objekt është një objekt dhe nëse emër është një atribut i aksesueshëm;
  3. Shihni nëse objekt është një objekt dhe nëse emër është një metodë;
  4. Shihni nëse objekt është një objekt dhe nëse merrniName është një metodë;
  5. Shihni nëse objekt është një objekt dhe nëse është Emri është një metodë.
    Këtu, me shënimin që përdorëm, duhej të prisnim që kushti i 4-të të arrinte në elementin tonë. Sepse emër nuk është një atribut i aksesueshëm, as një metodë.

    1
    {{ object.username }}

Në këtë rast, ne jemi duke u përpjekur për të hyrë Emri i përdoruesit. Ky atribut është një atribut publik (në Symfony e kam hasur rrallë këtë rast). Duhet të presim kushtin e dytë.

1
{{ object.getName() }}

Në rastin tonë të tretë, unë përpiqem të thërras metodën time drejtpërdrejt. Unë e marr rezultatin tim nga kushti i tretë, i cili është një kusht më i shpejtë.

1
{{ object.getUsername() }}

Në rastin tonë të katërt dhe të fundit, përpiqem të përdor drejtpërdrejt metodën time. Unë e marr rezultatin tim nga kushti i tretë. Në këtë rast, unë vendos një kusht shtesë për të hyrë në vlerën time.

Interpretimi i shablloneve të Twig

Kur pashë këtë detaj, mendova se si zhvilluesit e Twig mund të kishin bërë memorien dhe përpilimin e shablloneve. Nuk kaloi shumë kohë për të arritur në përfundimin se me pak informacion dhe lirinë që ofron menaxheri i shablloneve, skedarët tanë thjesht transkriptohen në PHP në një mënyrë të ngjashme me atë që mund të bënim plotësisht. Ju gjithashtu mund të shihni vetë duke kërkuar në dosjen tuaj të cache.

1
2
{# Dega e modelit #}
{{ object.name }}
Modeli i interpretuar në PHP
1
echo twig_escape_filter($this->env, $this->getAttribute((isset($context["object"]) ? $context["object"] : $this->getContext($context, "object")), "emri"), "html", null, i vërtetë);

Blloku i parë përputhet me atë që kam vënë në dukje në shabllonin tim të degës, blloku i dytë përputhet me versionin e përkthyer që gjeta në dosjen e memories.

Vëmë re se dega është përkthyer në PHP, por asnjë element nuk e ka lejuar atë të parashikojë se cila metodë duhet të thirret saktësisht. Metoda filtri_dega_escape mund të krahasohet me një përfaqësues. Është në këtë metodë që ne do të përcaktojmë se si i qasemi atributit.

Përfundim

Megjithëse shabllonet e degëzave ruhen automatikisht nga Symfony, ruhet vetëm versioni PHP, por pa interpretim të asaj që dëshironi të rikuperoni. Në teori, pra, këtu ka mjete për të optimizuar thirrjet dhe kohën e gjenerimit të shablloneve tanë, sepse verifikimi kryhet në çdo telefonatë.

Etapë

Unë ende doja të kisha një ide për përfitimet që mund të arrihen duke thirrur metodat dhe jo " pseudonim '.

Në rastin e parë, unë thërras një shabllon i cili do të thërrasë 10 herë të njëjtin objekt, i cili nga ana tjetër thërret 25 pseudonime. Kjo përfaqëson 250 thirrje. Rezultatet zmadhohen me ciklin prej 10 për të lejuar llogaritjet e sakta për sa i përket fitimit të performancës.

Së dyti, unë thërras një shabllon që do të thërrasë të njëjtin objekt 10 herë dhe i cili nga ana e tij thërret 25 metoda (gjithmonë nëpërmjet të njëjtit përfaqësues si për pseudonimet). Kjo është 250 përsëri.

Kam bërë thirrjen e këtyre shablloneve 5 herë secili.

Vini re se të gjitha thirrjet në shabllon që bëjnë thirrje në metoda janë më të shpejta. Duke marrë mesataret, vërejmë se shablloni që përdor pseudonime është më i gjatë për 54,6 milisekonda (197.4 – 142.8).

Duke bërë një llogaritje të shpejtë, vërejmë se nëse e reduktojmë në një rast të përgjithshëm, shablloni që përdor thirrjet në metoda është mesatarisht më i shpejtë në të njëjtat të dhëna me afërsisht 26.7%. Kjo mund të jetë interesante kur bëni shumë thirrje për objekte.

Ky artikull i dytë pason një postim të parë që jep zgjidhje të shpejta për të optimizuar gjenerimin e shablloneve. Është fryt i optimizimit të përdorur tashmë në vendet në prodhim, të cilat kishin një shkallë vonese shumë të lartë.

Ne përdorim të gjitha përfshin de modë për të ndryshuar ose faktorizuar pikëpamjet tona. Por ndoshta nuk e kuptove kurrë pse ne kishim aftësinë për të kaluar parametra, kur një bazë përfshin trashëgon variabla nga konteksti aktual.

1
{% përfshin "ProjectMyBundle:Sub:template.html.twig" %}

Shpesh ne përdorim këtë shënim. Në këtë rast, përfshirja do të japë një kopje të të gjitha ndryshoreve tona në shabllonin tonë. Kjo nuk është gjithmonë e nevojshme dhe ne gabojmë që kopjojmë të gjitha variablat tona.

Interesi i opsionit "të vetëm".

Pyesja veten për një kohë të gjatë se cili ishte qëllimi i këtij opsioni. Përveç kësaj, duhet thënë se dokumentacioni nuk jep shumë informacion. Ju mund t'i hidhni një sy dokumentacionit që përfshin Twig. Ai jep pak element, por jep veçanërisht një disavantazh dhe asnjë avantazh: të bësh pa variabla të caktuar. E parë në këtë mënyrë, nuk është fitimprurëse; pse duhet të bëj pa disa variabla.

Le të zbatojmë përfshin tonë! Le të themi se shablloni ynë bazë ka 5 variabla dhe unë përfshij një shabllon që përdor vetëm një nga këto variabla, ky është shënimi që do të jetë i preferueshëm.

1
{% përfshin "ProjectMyBundle:Sub:template.html.twig" me {"object": myVar} vetëm %}

Në këtë mënyrë vetëm një variabël "objekt" do të jetë i disponueshëm në shabllonin tim. Kjo kufizon kopjimin e variablave të padobishëm, dhe rrjedhimisht shpërndarjen e memories (kursimi i kohës dhe konsumit të memories).

Kodi dhe rastet e përdorimit

1
2
3
4
5
6
// Kontrollues
// Këtu gjeneron një shabllon duke kaluar një variabël imponues (një koleksion) që përmban të gjitha objektet për një tabelë të caktuar
publik funksion testVeprim() {
$objekte = $ kjo-> enë-> merrni("doctrine.orm.default_entity_manager")->getRepository("ProjectMyBundle: Test")->findAll();
kthim grup("artikuj" => $objekte);
}

Ne kalojmë koleksionin tonë dhe i japim shabllonit çdo përsëritje të koleksionit një shabllon. Në këtë rast, sa herë që bëjmë thirrje për integrimin e një shablloni, të gjitha variablat kopjohen si dhe ato që kalojnë me opsionin "me".. Në rastin tonë të parë, ne mund të imagjinonim shumë mirë qasjen në koleksionin tonë (objektet) si dhe përsëritjen tonë aktuale (objekt).

1
2
3
4
5
{#Tabela 1#}
{% për objekt në objekte %}
{% përfshin "ProjectMyBundle:Sub:template.html.twig" me {"object": objekt} %}
{% fundfor %}

Në rastin tonë të dytë, unë aktivizoj opsionin është vetëm i cili ju lejon të kopjoni vetëm variablat e kaluar si parametra. Lehtë?

1
2
3
4
5
{#Tabela 2#}
{% për objekt në objekte %}
{% përfshin "ProjectMyBundle:Sub:template.html.twig" me {"object": object} vetëm %}
{% fundfor %}

Etapë

Provat i kam kryer me shabllonet dhe kodin e dhënë në pjesën e mësipërme. Unë performova me 5 përsëritje të secilit shabllon, duke kujtuar të zbrazja cache-në përpara çdo testi të parë.

Me këtë grafik, ne mund të shohim që ngarkimi është përgjithësisht më i gjatë për ata që nuk e përdorin opsionin është vetëm. Diferenca tenton të zvogëlohet pas cachimit. Kjo për faktin se shablloni im është i vogël dhe përdoren pak variabla. Në rastet më të aplikuara, ka fitime deri në 30%.

Këtu, nëse mesatarizojmë vlerat, arrijmë një diferencë mesatare prej 9 ms (48,6 – 39,6 = 9). Prandaj, ne mund të llogarisim një fitim të përafërt prej 20% edhe nëse kjo do të vihet në perspektivë në rastin tonë, pasi gjuajtja e parë është tmerrësisht e gjatë pa përdorimin e " është vetëm '.

★ ★ ★ ★ ★