PHP fájl alapú gyorstárazás
2009-12-21T12:14:03+01:00
2009-12-21T12:48:40+01:00
2022-06-29T08:55:51+02:00
  • Használat: $conf = new tCache('config'); if(!$conf->check()) { $conf->add($site = getTableAssoc("SELECT * FROM NAGYONNAGYTABLA")); } else { $site = $conf->get(); }

    En a check-et a get-bol hivnam meg, ha get null-t terit vissza, akkor a DB-bol valo lekerdezes utan cache-elnem az eredmenyt...
    Mutasd a teljes hozzászólást!
  • Memcached: mert még nem szeretném, de később megfontoljuk. :)

    A die() valóban hülyeség volt, létrehoztam egy $this->err változót a hibák kezelésére. Így?:

    class tCache { public $key = ''; public $ttl = 0; public $err = false; private $data = ''; private $file = ''; public function __construct($key,$ttl=300) { $this->key = trim($key); $this->file = CACHEFILES.DS.md5($this->key).'.cache'; if(!is_writeable(CACHEFILES.DS)) $this->err = true; $this->ttl = (int)$ttl; } public function add($data) { $this->data = $data; if(!$this->err) { return($this->err = (boolean)@file_put_contents($this->file,serialize($this->data))); } } public function get() { if($this->err) { return $this->data; } else { return unserialize(file_get_contents($this->file)); } } public function check() { if($this->err) return false; if(is_file($this->file)) { $ok = (time("U") - filemtime($this->file)) < $this->ttl; if(!$ok) unlink($this->file); } else $ok = false; return(boolean)$ok; } }

    Használat:

    $conf = new tCache('config'); if(!$conf->check()) { $conf->add($site = getTableAssoc("SELECT * FROM NAGYONNAGYTABLA")); } else { $site = $conf->get(); }

    Így ha hiba van a könyvtár jogaival vagy az írással, akkor a check() is false-al tér vissza, újra bemegy az adat DB-ből és vissza.
    Mutasd a teljes hozzászólást!
  • Memcached miert nem jo? Sokkal gyorsabb a memoriabol lekerni az adatokat, mint fajlbol...

    A kododban hiba eseten ne allitsd le a script futasat die()-al, a rendszerednek akkor is mukodnie kell, ha a cache hibat jelez!

    Meg implementalnod kell valamilyen GC-t a "lejart" cache-elt ojjektumok torlesere. Nem tetszik, hogy a konstruktorban adod meg a kulcsot es ttl-t, ezek szerint minden cache-be valo tarolaskor meg beolvasaskor meg kell adnod azokat, ha nincs meg az eredeti osztalypeldanyod.

    A ttl-t meg az eltarolt ojjektummal egyutt elmentenem, igy a GC is tudna ellenorizni...
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Egy készülő rendszer bizonyos adatbázis-lekéréseit szeretném gyorstárazni. Nézegettem az APC és a Memcached kiegészítőket, de én most egy saját, egyszerű, fájl alapon működő gyorstárat írtam.

    Szeretnék véleményeket kérni helyes-e ez az út, ha nem, miért nem, és javaslatot szeretnék kérni esetleges bővítésre vagy alternatívára.

    CACHEFILES konstans: cache fájlok mappája
    DS konstans: DIRECTORY_SEPARATOR

    class tCache { public $key = ''; public $ttl = 0; private $data = ''; private $file = ''; public function __construct($key,$ttl=300) { $this->key = trim($key); $this->file = CACHEFILES.DS.md5($this->key).'.cache'; if(!is_writeable(CACHEFILES.DS)) die("Error: ".CACHEFILES.DS." is not writeable!"); $this->ttl = (int)$ttl; } public function add($data) { $this->data = serialize($data); return(file_put_contents($this->file,$this->data)); } public function get() { return unserialize(file_get_contents($this->file)); } public function check() { if(is_file($this->file)) { $ok = (time("U") - filemtime($this->file)) < $this->ttl; if(!$ok) unlink($this->file); } else $ok = false; return(boolean)$ok; } }
    Mutasd a teljes hozzászólást!
abcd