View file libraries/file_cache.php

File size: 2.38Kb
<?php
/**
 * Ant0ha's project
 *
 * @package
 * @author Anton Pisarenko <[email protected]>
 * @copyright Copyright (c) 2006 - 2010, Anton Pisarenko
 * @license http://ant0ha.ru/license.txt
 * @link http://ant0ha.ru
 */

//----------------------------------------------------
/**
 * File Cache class
 */
class File_Cache {
    /**
    * Constructor
    */
    public function __construct($dir) {
        $this->dir = $dir;
    }

	/**
	* Получение данных
	*/
    public function get($key, $expiration = 3600) {
		if ( !is_dir($this->dir) OR !is_writable($this->dir)) {
            exit('Директория для кэша не найдена, либо нет прав на запись!');
        }

        $cache_path = $this->_name($key);

        if (!@file_exists($cache_path)) {
            return FALSE;
        }

        if (filemtime($cache_path) < (time() - $expiration)) {
            $this->clear($key);
            return FALSE;
        }

        if (!$fp = @fopen($cache_path, 'rb')) {
            return FALSE;
        }

        flock($fp, LOCK_SH);

        $cache = '';

        if (filesize($cache_path) > 0) {
            $cache = unserialize(fread($fp, filesize($cache_path)));
        }
        else {
            $cache = NULL;
        }

        flock($fp, LOCK_UN);
        fclose($fp);

        return $cache;
    }

	/**
	* Запись данных
	*/
    public function set($key, $data) {
		if (!is_dir($this->dir) OR !is_writable($this->dir)) {
            exit('Директория для кэша не найдена, либо нет прав на запись');
        }

        $cache_path = $this->_name($key);

        if ( ! $fp = fopen($cache_path, 'wb')) {
            return FALSE;
        }

        if (flock($fp, LOCK_EX)) {
            fwrite($fp, serialize($data));
            flock($fp, LOCK_UN);
        }
        else {
            return FALSE;
        }

        fclose($fp);
        @chmod($cache_path, 0777);
        return TRUE;
    }

	/**
	* Очистка кэша по ключу
	*/
    public function clear($key) {
        $cache_path = $this->_name($key);

        if (file_exists($cache_path)) {
            unlink($cache_path);
            return TRUE;
        }

        return FALSE;
    }

	/**
	* Генерация имени файла
	*/
    private function _name($key) {
        return sprintf("%s/%s", $this->dir, md5($key));
    }
}

?>