V predošlom článku z kategórie PHP som uviedol praktický príklad jednoduchého cachovania stránok. Ale ako som povedal, je to vhodné len pre jednoduché weby, čiže dnes si ukážeme iný spôsob, ktorý používam na mojom bicyklovom webe. Nie že by to bolo potrebné, ale chcel som si to skúsiť a páči sa mi to ;).
Jedná sa o kešovanie dátových štruktúr pomocou serialize()/unserialize().
Pointa je jednoduchá. Predstavte si, že z databázy ťaháme veľa dát, cez ORM si ich namapujeme na objekty v poli a ešte k tomu nad týmito objektmi robíme nejaké zložité operácie. Napríklad rôzne parsovanie textu… Pri veľkom počte požiadaviek na server to avšak môže byť náročné a stále dookola robiť tú istú operáciu nemá zmysel, keď si jednoducho spracované pole objektov môžeme uložiť do cache.
Ako na to ?
Jednoducho ;) Napríklad stačí ak použijeme moju triedu Cache:
class Cache {
public static $CacheDir = '/tu/bude/ulozena/cache/';
/* Metóda CacheData() slúži na uloženie dátových štruktúr do súboru */
public static function CacheData($data, $strId) {
if(is_dir(Cache::$CacheDir) && is_writable(Cache::$CacheDir)) {
$fh = fopen(Cache::$CacheDir . $strId, 'w');
if($fh && flock($fh, LOCK_EX)) {
$ret = fwrite($fh, serialize($data));
flock($fh, LOCK_UN);
return $ret;
}
}
return false;
}
/* GetCacha() slúži na získavanie dátových štruktúr zo súboru,
* ak nie ste lenivý, tak si sem dorobte flock() ;)
*/
public static function GetData($strId) {
if(file_exists(Cache::$CacheDir . $strId)) {
return unserialize(file_get_contents(Cache::$CacheDir . $strId));
}
return false;
}
/* Mazanie jednotlivých cache */
public static function Delete($strRegexp) {
foreach(scandir(Cache::$CacheDir) as $file) {
if(ereg($strRegexp, $file)) {
unlink(Cache::$CacheDir . $file);
}
}
}
}
A použitie triedy je zas veľmi jednoduché:
/* pokúsime sa získať dáta z cache a ak sa nám to podarí,
* tak podmienka pre if() nebude splnená
*/
if( ! $objArray = Cache::GetData('identifikator-cache')) {
/* ak sme sa dostali sem, tak sa nám dáta z cache nepodarilo získať,
* čiže ich nahráme z DB, spracujeme a následne sa ich pokúsime pridať do cache
*/
Cache::CacheData($objArray, $this->CacheId);
}
?>
Ako vidíte použitie je veľmi jednoduché. Treba si dať pozor aby ste používali pre každý skript, alebo triedu unikátne cache Id. Ak chcete zmazať cache napríklad pri zmene dát, tak použijete Cache::Delete(‚identifikator-cache‘). Osobne som netestoval aký to má vplyv na výkon aplikácie, ale ak má niekto osobné skúsenosti tak sa o ne podeľte v komentároch.
Takisto ak máte niekto akékoľvek otázky, tak sme snimi, alebo si pozrite aj ďalší spôsob cachovania na phpblog.sk.
Pridaj komentár