Tagovi keša
Tagovi keša = zavisnosti podataka
Tagovi keša opisuju zavisnosti od podataka koje upravlja Drupal
Zašto?
Keš tagovi pružaju deklarativan način za praćenje koji keš elementi zavise od određenih podataka kojima upravlja Drupal.
Ovo je važno za CMS/framework kao što je Drupal jer se isti sadržaj može ponovo koristiti na različite načine. Drugim rečima: nije moguće unapred znati gde će se određeni sadržaj koristiti. Na svakom mestu gde se sadržaj koristi, može biti keširan. To znači da isti sadržaj može biti keširan na desetine mesta. Ovo nas vodi poznatoj izreci: u informatici postoje samo dva ozbiljna problema: poništavanje keša i imenovanje. Kako ćete poništiti sve keš elemente u kojima se koristi sadržaj?
Napomena: Drupal 7 nudi tri načina za poništavanje keš elemenata: poništiti određeni CID, poništiti korišćenje CID prefiksa ili poništiti sve u keš kontejneru. Nijedan od ova tri načina ne dozvoljava poništavanje keša koji sadrže izmenjeni entitet, jer to nije bilo moguće znati!
Koji?
Tag keša je string.
Keš tagovi se prosleđuju kao skupovi (redosled nije bitan) stringova, zato su predstavljeni kao string[]. To su skupovi jer jedan keš element može zavisiti od više keš tagova.
Sintaksa
Po konvenciji, oni imaju oblik thing:identifier — a kada ne postoji koncept više instanci stvari, imaju oblik thing. Jedino pravilo je da ne mogu sadržati razmake.
Nema stroge sintakse.
Primeri:
- node:5 - tag keša za čvor (node) sa ID 5 (poništava se kad god se menja)
- user:3 - tag keša za korisnika sa ID 3 (postaje nevažeći pri svakoj izmeni)
- node_list - lista keš tagova za sve čvorove (poništava se kad se bilo koji čvor ažurira, izbriše ili kreira, tj. kad se menja lista čvorova). Ovo važi za svaki tip entiteta u formatu {entity_type}_list.
- config:system.performance - tag keša za konfiguraciju system.performance
- library_info - tag keša za biblioteke resursa
Opšti keš tagovi
Podaci kojima upravlja Drupal dele se u tri kategorije:
- entiteti - imaju keš tagove oblika <entity type ID>:<entity ID>, kao i <entity type ID>_list i <entity type ID>_list:<bundle> za poništavanje lista entiteta. Tipovi objekata konfiguracije koriste tag keša osnovnog konfiguracionog objekta.
- konfiguracija - imaju keš tagove oblika config:<configuration name>
- prilagođeni (custom), npr. library_info
Drupal automatski pruža keš tagove za entitete i konfiguraciju — vidi bazu klase Entity i baznu klasu ConfigBase. (Svi konkretni tipovi entiteta i objekti konfiguracije nasleđuju ih.)
Iako mnogi tipovi objekata prate predvidiv format tagova keša <entity type ID>:<entity ID>, spoljnji kod ne treba da se oslanja na to. Umesto toga, treba da pribavi keš tagove za poništavanje za pojedinačni objekat koristeći metodu ::getCacheTags(), npr. $node->getCacheTags(), $user->getCacheTags(), $view->getCacheTags() i sl.
Takođe, može biti potrebno poništiti keš baziran na listama koje zavise od podataka datog entiteta (npr. ažurirati renderovani HTML liste kada se kreira novi entitet za nju). Ovo se može postići korišćenjem EntityTypeInterface::getListCacheTags(), a zatim poništiti sve tagove koje ova metoda vrati zajedno sa sopstvenim tagovima objekta. Od Drupal 8.9 (obaveštenje o promeni), entiteti sa paketima automatski imaju i konkretniji keš tag koji uključuje njihov paket radi preciznijeg poništavanja lista.
Moguće je definisati i prilagođene, preciznije keš tagove zasnovane na vrednostima koje objekti imaju, npr. polje reference na termin za liste koje prikazuju objekte sa određenim terminom. Poništavanje ovakvih tagova može se smestiti u prilagođene pre-save/pre-delete hvatače entiteta:
function yourmodule_node_presave(NodeInterface $node) { $tags = []; if ($node->hasField('field_category')) { foreach ($node->get('field_category') as $item) { $tags[] = 'mysite:node:category:' . $item->target_id; } } if ($tags) { Cache::invalidateTags($tags); } }
Ove tagove možete koristiti u kodu i u prikazima, koristeći ponuđeni modul Views Custom Cache Tag.
Napomena: Trenutno ne postoji API za dobijanje pojedinačnih paketa i preciznijih keš tagova od objekta ili nekog drugog objekta, jer nije objekat koji odlučuje koji su tagovi liste relevantni za određeni upit, već sam upit. Buduće verzije Drupal jezgra verovatno će unaprediti ugrađenu podršku za keš tagove za svaki paket i, na primer, integrisati ih u entitetski query builder i prikaze.
Kako
Postavljanje
Bilo koji keš server treba da implementira CacheBackendInterface, tako da pri postavljanju keš elementa metodom ::set() navedete treći i četvrti argument, npr.:
$cache_backend->set( $cid, $data, Cache::PERMANENT, ['node:5', 'user:7'] );
Ovo čuva keš element sa ID-em $cid trajno (neograničeno), ali ga čini podložnim poništavanju preko keš tagova node:5 ili user:7.
Poništavanje
Keš elementi se poništavaju pomoću svojih tagova preko cache_tags.invalidator:invalidateTags() (ili, ako ne možete ubaciti servis cache_tags.invalidator: Cache::invalidateTags()), koji prihvata skup keš tagova (string[]).
Napomena: ovo poništava elemente označene datim tagovima u svim keš kontejnerima. Nema smisla poništavati tagove keša samo u pojedinačnim binovima, jer promenjeni podaci sa nevažećim tagovima mogu zavisiti od keš elemenata u drugim binovima.
Debug
Sve prethodno je korisna informacija za debugovanje bilo čega što je keširano. Ali postoji još jedna stvar: recimo da se nešto kešira sa keš tagovima ['foo', 'bar']. Tada će odgovarajući keš element imati kolonu tagova (pretpostavimo na trenutak da je u kešu baze podataka) sa sledećom vrednošću:
bar foo
Drugim rečima:
- keš tagovi su odvojeni razmakom
- keš tagovi su sortirani po abecedi
Ovo olakšava analizu i debug keševa!
HTTP zaglavlja (debug)
Na kraju: lako je videti od kojih keš tagova zavisi određeni odgovor (i samim tim kada postane nevažeći) tako što ćete pogledati samo HTTP zaglavlje X-Drupal-Cache-Tags!
(Zato razmaci nisu dozvoljeni: jer zaglavlje X-Drupal-Cache-Tags, kao i mnoga HTTP zaglavlja, koristi razmake za odvajanje vrednosti.)
Napomena: Ako ne vidite ova zaglavlja, potrebno je da podesite Drupal instancu za razvoj.
Integracija sa reverznim proxy serverima
Umesto da keširate odgovore u Drupalu i poništavate ih pomoću keš tagova, takođe možete keširati odgovore u reverznim proxy serverima (Varnish, CDN ...) i potom poništavati odgovore koje oni keširaju koristeći tagove povezane sa tim odgovorima. Da bi ti proxy serveri znali koje keš tagove svaki odgovor nosi, možete poslati keš tagove zajedno sa HTTP zaglavljem.
Baš kao što Drupal 8 može slati HTTP zaglavlje X-Drupal-Cache-Tags radi debugovanja, on takođe može slati zaglavlje Surrogate-Keys sa vrednostima odvojenim razmacima, što očekuju neki CDN, ili zaglavlje Cache-Tag sa vrednostima odvojenim zarezima, što očekuju drugi CDN. Ovo može biti i reverzni proxy server koji sami pokrećete, a ne komercijalni CDN servis.
Generalno se preporučuje da i vaš web server i reverzni proxy podržavaju zaglavlja odgovora sa vrednostima do 16 KB.
1. HTTP je tekstualni protokol. Keš tagovi su takođe zasnovani na tekstu. Reverzni proxy može slobodno predstaviti keš tagove unutar druge strukture podataka. Ograničenje od 16 KB za vrednost zaglavlja odgovora izabrano je zbog dva faktora: A) da bi radilo u 99% slučajeva, B) da je praktično ostvarivo. Tipični web serveri (Apache) i CDN (Fastly) podržavaju vrednosti zaglavlja od 16 KB. To znači oko 1000 keš tagova, što je dovoljno za 99% slučajeva.
2. Broj keš tagova značajno varira u zavisnosti od sajta i konkretnog odgovora. Ako je odgovor zavistan od mnogo stvari, biće mnogo tagova. Više od 1000 tagova u odgovoru je retko.
3. Naravno, ovaj vodič (~1000 tagova po odgovoru) će se menjati s vremenom, kako A) vidimo kako se koristi u realnim aplikacijama, B) kako sistemi namenski koriste i grade na ovoj funkcionalnosti.
Na kraju, svaki odgovor sa više od 1000 tagova verovatno ukazuje na dublji problem: odgovor je previše složen i trebalo bi ga podeliti. Nema prepreka da pređete ovu brojku u Drupalu, ali to može zahtevati ručno podešavanje. To je prihvatljivo za ekstremno složene slučajeve korišćenja. Možda se dešava čak i ispod 1000 tagova.
Pročitajte dokumentaciju o korišćenju Varnish sa keš tagovima.
Poznato je da CDN podržavaju poništavanje/čišćenje na osnovu tagova:
CloudFlare
Fastly
KeyCDN
Akamai
Unutrašnji keš stranice
Sveobuhvatna upotreba keš tagova u Drupalu 8 omogućava isporuku Drupala 8 sa unutrašnjim kešom stranice uključenim po defaultu. To je ustvari ugrađeni reverzni proxy.
Pogledajte i
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.