Keširanje objekata u WordPress-u: Redis i Memcached
WordPress sajtovi koji opslužuju veliki broj klijenata moraju imati stalni mehanizam keširanja, ne samo slika i stranica, već i samih PHP objekata. Iako WordPress već obezbeđuje ovaj mehanizam putem WP_Object_Cache-a, postoje i neka druga rešenja koja nude velike mogućnosti. Ali pre svega da vidimo šta je to keširanje objekata u WordPress-u i kako ono radi u PHP-u.
Keširanje objekata
Kao objektno orijentisan programski jezik PHP koristi objektnu paradigmu za pravljenje strukture koda. Kao rezultat toga, WordPress veb-sajt može da se sastoji od mnogo različitih PHP objekata koji se stalno kreiraju, instanciraju i uništavaju (od strane memory manager-a). Ovo kreiranje i uništavanje objekata ima svoju cenu, pogotovo ako ima mnogo takvih događaja. Pored toga mnogi od njih se često i iznova koriste, s obzirom da oni predstavljaju core funkcionalnosti. Drugim rečima, svaki put kada ih aplikacija ponovo zatraži, oni moraju da se ispočetka instanciraju.
Idealno bi bilo da takve objekte keširamo, a ne da ih uništavamo i ponovo stvaramo ispočetka.
Možete koristiti PHP funkciju serialize() kako biste konvertovali objekat u blob koji će biti sačuvan u memoriji ili na disku, kako biste mu kasnije pristupili. Zatim možete izračunati blob-ov hash broj koristeći funkciju hash() i oba sačuvati na isti način. Hash kao ključ i blob kao vrednost. Da biste ga pozvali, treba da iskoriistite blob-ov hash broj koji je prethodno sačuvan kao ključ. Na ovaj način možete bilo šta (string, broj, objekat, niz…) pretvoriti u njegovu verziju koja se može sačuvati u memoriji ili disku.
Primer:
$serialized = serialize(array('test'));
Možemo izvesti i reverznu operaciju sa funkcijom unserialize ()
$original=unserialize($serialized);
U principu tri su načina na koja možete keširati objekte: Koristeći izvorni (native) WordPress Object Cache, Transients API ili eksterno ključ-vrednost čuvanje koje obezbeđuju Redis ili Memcached.
WordPress Object Cache
WordPress nudi dva API-ja za kešitanje: Izvorni (native) WordPress Object Cache i Transients API. Oni su identični, pa iako zbog toga mogu izazvati zabunu, ipak postoji logika koji ćemo sada pojasniti.
Izvorni WordPress Object Cache može da čuva objekte i primitive u kešu, ali ne na način koji omogućava stalnost. Ovo znači da se keširanje dešava u memoriji i da keširani objekti ne postoje preko njihovog definisanog životnog veka. Iz tog razloga ne možete deliti keširane objekte na različitim stranama nakon njihovog učitavanja. Za tako nešto je potrebno da obezbedite mehanizam čuvanja uz pomoć plugin-ova koji će proširiti ovu funkcionalnost WordPress-a.
Transients API sa druge strane ima gotovo rešenje. Možete sačuvati promenljive, nizove, objekte za koje ćete definisati datum isteka direktno u bazi i tako obezbediti stalno keširanje objekata. Ipak, ovde dolazi do problema da kada keširani objekat istekne, on ostaje u bazi gde bespotrebno zauzima mesto. To znači da morate obezbediti stalni nadzor nad bazom i njenim održavanjem, kako biste je držali čistom od takvih objekata.
WordPress može da detektuje da li ste implementirali neko vaše rešenje za keširanje objekata i kada pronađe da je to slučaj, svi pozivi prema Transients API-ju se zaobilaze i rutiraju prema WordPress Object Cache-u (pa se iz tog razloga čine identični).
Redis i Memcached
Redis je key-value baza koja čuva podatake u memoriji sa povremenim dump-om baze na disk i ima visoku dostupnost u konfiguraciji klastera. Takođe možete fino podesiti željeni nivo postojanosti na disku. Dobra stvar u vezi sa Redisom je da će, ako restartujete sistem, većina keš memorije i dalje biti dostupna jer će se učitati sa diska u memoriju. U regularnom scenariju nakon ponovnog pokretanja server bi morao ponovo da izgradi keš memoriju i to najčešće povećava opterećenje. Sa Redisom se to ne dešava. Pored toga, objekti kojima je istekao rok odmah se brišu iz baze, pa nema potrebe za dodatnim nadzorom nad objektima kojima je istekao rok.
Memcached je takođe key-value baza zgodna za keširanje objekata koji je, prema zvaničnoj veb stranici proizvođača, posebno dizajniran za ubrzavanje dinamičkih veb aplikacija i ublažavanje opterećenja baze podataka. Takođe je mnogo jednostavniji za upotrebu od Redisa, ne podržava dump na disk jer Memcached je multi-threaded za razliku od Redis-a koji je single thread.
Zbog toga što je posebno dizajniran za keširanje objekata za veb-stranice a činjenica da koristi bazu podataka u memoriji, čini ga prilično brzim rešenjem za keširanje objekata. Sa druge strane, kao što smo ranije napomenuli, ako se server ponovo pokrene, keš memorija će biti izbrisana i dok se ponovo ne uspostavi, verovatno ćete imati povećano opterećenje na bazu. To je ujedno mana ovog sistema za keširanje, ali i bez obzira na to ima smisla da ga koristite kao sistem za keširanje vašeg veb-sajta.
Zaključak
Kao što smo videli oba rešenja imaju i svoje prednosti i mane. Da li ćete se uopšte opredeliti za neko od njih, zavisi pre svega od toga koliki broj objekata ima vaša aplikacija / veb-sajt. Ukoliko je to manji broj objekata (recimo desetak), onda nećete primetiti neku korist i ubrzanje korišćenjem pomenutih rešenja. Ukoliko je sa druge strane to broj koji se meri stotinama, onda možete imati korist od implementacije nekog od pomenutih rešenja. U svakom slučaju sada znate više o tome kako radi keširanje objekata u WordPress-u.
4 komentara. Ostavi novi
Tek ucim WP platformu, pa sa njom i malo HTML-a, CSS-a i PHP-a. Da li mi mozete pojasniti u ovoj recenici „serialize() kako biste konvertovali objekat u blob“ sta je blob? 🙂 Hvala
Pozdrav Jeco. U pitanju je skraćenica od Binary Large Object (Veliki binarni objekat). U pitanju je vrsta podatka koji se koristi u DB za skladištenje različitih vrsta binarnih podataka (često multimedijalnih, ali i programa). Nema direktne veze sa WP, ali ako te zanima da pročitaš nešto osnovno na tu temu, možeš na ovom linku https://www.geeksforgeeks.org/blob-full-form/
Samo napred sa učenjem! 🙂
Pozdrav!
Samo bih iskoristila priliku da vam se zahvalim sto delite ovoliko informacija sa nama pocetnicima. Mnogo sam naucila iz vaseg bloga!
Hvala, Biljana! Nadamo se da smo pomogli 🙂