Cache zapytań SQL

W jednym z wcześniejszych wpisów „Klasa dostępu do bazy danych” użyłem klasy do przechowywania wyników zapytań w cache. Przyszła więc pora na prezentację tej klasy.

Przy jej pomocy można do cache zapisywać nie tylko wyniki zapytań sql ale też dowolne inne dane. Wadą tego rozwiązania jest brak automatycznego czyszczenia cache. Może to doprowadzić do wygenerowania dużej ilości plików na dysku. Jednak mam nadzieję, że w wolnej chwili uda mi się to uzupełnić.

/**
 * Klasa obsługująca cache zapytań do bazy.
 */
class Db_Cache {

    private $cacheDir = null;

    public function  __construct() {
        $this->cacheDir = CACHE_DB_PATH;
    }

    private function getFileName($cacheName) {
        return $this->cacheDir.'/cache__'.$cacheName;
    }

    /**
     *
     * Pobiera dane z cache.
     *
     * Jeśli zwraca null to znaczy, że nie ma cache lub cache wygasł.
     *
     * @param string $cacheName
     * @return mixed|null
     */
    public function getData($cacheName) {
        $file = $this->getFileName($cacheName);

        if(!file_exists($file)) {
            return null;
        }

        $result = @file_get_contents($file);

        if (is_bool($result) && $result == false) {
            //cache nie założony
            return null;
        } else {
            $tmp = unserialize($result);
            if($tmp[0] < date('U')) {
                //cache się przedawnił
                return null;
            } else {
                //zwracam cache
                return $tmp[1];
            }
        }
    }

    /**
     *
     * Dodaje dane do cache.
     *
     * @param string $cacheName
     * @param int $lifeTime
     * @param mixed $data
     * @return void
     */
    public function setData($cacheName, $lifeTime, $data) {
        if($lifeTime > 0) {
            $file = $this->getFileName($cacheName);

            $data = serialize(array(
                $lifeTime+date('U'),
                $data
            ));

            if(CACHE_DB) {
                file_put_contents($file, $data);
            }
        }
    }

    /**
     *
     * Usuwa cache.
     *
     * @param string $cacheName
     * @return void
     */
    public function clearCache($cacheName) {
        $filename = $this->getFileName($cacheName);
        if(file_exists($filename)) {
            unlink($filename);
        }
    }
}

5 thoughts on “Cache zapytań SQL

  1. Nie no nie wiem czy to wina webserv czy co, ale za nic w świecie nie chce mi stworzyć pliku – dopiero jak fizycznie go na serwerze stworzę to skrypt działa, w przeciwnym wypadku wywala błąd ;/

  2. Moim zdaniem takie cachowanie w większości przypadków spowolni odpytywanie bazy danych. Jeśli chcecie przyspieszyć użyjcie pamięci do przechowywania wyników memcache itp. Natomiast to rozwiązanie nadaje się do cachowania obrazków np przetworzonych przez gd.

  3. To cachowanie ma na celu zastąpić odczytywanie z bazy. Odczyt danych z pliku jest zawsze szybszy niż z bazy danych.

Comments are closed.