Cachovanie dátových štruktúr v PHP


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é:

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.


2 odpovede na “Cachovanie dátových štruktúr v PHP”

  1. Dakujem za super priklad, davno som nieco podobne hladal, je nieco cez repozitar PEAR, ale toto riesenie sa mi velmi paci, pouzil som to do mojho pripravovaneho cms.

    Martin Benadik

  2. Ja ďakujem za reakciu, aspoň viem, že to malo aspoň dáky zmysel písať tento článok a takisto som si ho znovu prečítal a opravil množstvo chýb a preklepov ;)

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.