首页 > php开发 > php文件缓存类实例整理

php文件缓存类实例整理

缓存类是我们开发应用中会常用使用到的功能,下面我来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类吧.

例1,代码如下:

<?php
$fzz = new fzz_cache;
$fzz->kk = $_SERVER; //写入缓存
//$fzz->set("kk",$_SERVER,10000); //此方法不与类属性想冲突,可以用任意缓存名;
print_r($fzz->kk); //读取缓存
//print_r($fzz->get("kk"));
//unset($fzz->kk); //删除缓存
//$fzz->_unset("kk");
var_dump(isset($fzz->kk)); //判断缓存是否存在
//$fzz->_isset("kk");
//$fzz->clear(); //清理过期缓存
//$fzz->clear_all(); //清理所有缓存文件
class fzz_cache {
    public $limit_time = 20000; //缓存过期时间
    public $cache_dir = "data"; //缓存文件保存目录
    //写入缓存
    function __set($key, $val) {
        $this->_set($key, $val);
    }
    //第三个参数为过期时间
    function _set($key, $val, $limit_time = null) {
        $limit_time = $limit_time ? $limit_time : $this->limit_time;
        $file = $this->cache_dir . "/" . $key . ".cache";
        $val = serialize($val);
        @file_put_contents($file, $val) or $this->error(__line__, "fail to write in file");
        @chmod($file, 0777);
        @touch($file, time() + $limit_time) or $this->error(__line__, "fail to change time");
    }
    //读取缓存
    function __get($key) {
        return $this->_get($key);
    }
    function _get($key) {
        $file = $this->cache_dir . "/" . $key . ".cache";
        if (@filemtime($file) >= time()) {
            return unserialize(file_get_contents($file));
        } else {
            @unlink($file) or $this->error(__line__, "fail to unlink");
            return false;
        }
    }
    //删除缓存文件
    function __unset($key) {
        return $this->_unset($key);
    }
    function _unset($key) {
        if (@unlink($this->cache_dir . "/" . $key . ".cache")) {
            return true;
        } else {
            return false;
        }
    }
    //检查缓存是否存在,过期则认为不存在
    function __isset($key) {
        return $this->_isset($key);
    }
    function _isset($key) {
        $file = $this->cache_dir . "/" . $key . ".cache";
        if (@filemtime($file) >= time()) {
            return true;
        } else {
            @unlink($file);
            return false;
        }
    }
    //清除过期缓存文件
    function clear() {
        $files = scandir($this->cache_dir);
        foreach ($files as $val) {
            if (filemtime($this->cache_dir . "/" . $val) < time()) {
                @unlink($this->cache_dir . "/" . $val);
            }
        }
    }
    //清除所有缓存文件
    function clear_all() {
        $files = scandir($this->cache_dir);
        foreach ($files as $val) {
            @unlink($this->cache_dir . "/" . $val);
        }
    }
    function error($msg, $debug = false) {
        $err = new Exception($msg);
        $str = "<pre> 
<span style='color:red'>error:</span> 
" . print_r($err->getTrace() , 1) . " 
</pre>"; //开源代码phprm.com
        if ($debug == true) {
            file_put_contents(date('Y-m-d H_i_s') . ".log", $str);
            return $str;
        } else {
            die($str);
        }
    }
}
?>

例2.从CI社区的stblog和CI的file_helper类中提取出来的php文件缓存类,一个简单的基于文件的key->value缓存类。

这个类可以用来缓存一些基本信息,比如博客的header,footer,sidebar中的一些不经常变化,从数据库中取出的内容,取数据前先判断文件缓存中的内容是否过期,如果没过期取出来,过期了则连接数据库查询,并将结果重新写入文件缓存,更新过期时间。跟memcache使用类似,不过更方便。用在一些小的应用上足够了...代码如下:

<?php
define('DIRECTORY_SEPARATOR', '/');
define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb');
define('FOPEN_WRITE_CREATE', 'ab');
define('DIR_WRITE_MODE', 0777);
class FileCache {
    /** 
     * 缓存路径
     *
     * @access private
     * @var string
     */
    private $_cache_path;
    /** 
     * 缓存过期时间,单位是秒second
     *
     * @access private
     * @var int
     */
    private $_cache_expire;
    /** 
     * 解析函数,设置缓存过期实践和存储路径
     *
     * @access public
     * @return void
     */
    public function __construct($expire, $cache_path) {
        $this->_cache_expire = $expire;
        $this->_cache_path = $cache_path;
    }
    /** 
     * 缓存文件名
     *
     * @access public
     * @param  string $key
     * @return void
     */
    private function _file($key) {
        return $this->_cache_path . md5($key);
    }
    /** 
     * 设置缓存
     *
     * @access public
     * @param  string $key 缓存的唯一键
     * @param  string $data 缓存的内容
     * @return bool
     */
    public function set($key, $data) {
        $value = serialize($data);
        $file = $this->_file($key);
        return $this->write_file($file, $value);
    }
    /** 
     * 获取缓存
     *
     * @access public
     * @param  string $key 缓存的唯一键
     * @return mixed
     */
    public function get($key) {
        $file = $this->_file($key);
        /** 文件不存在或目录不可写 */
        if (!file_exists($file) || !$this->is_really_writable($file)) {
            return false;
        }
        /** 缓存没有过期,仍然可用 */
        if (time() < (filemtime($file) + $this->_cache_expire)) {
            $data = $this->read_file($file);
            if (FALSE !== $data) {
                return unserialize($data);
            }
            return FALSE;
        }
        /** 缓存过期,删除之 */
        @unlink($file);
        return FALSE;
    }
    function read_file($file) {
        if (!file_exists($file)) {
            return FALSE;
        }
        if (function_exists('file_get_contents')) {
            return file_get_contents($file);
        }
        if (!$fp = @fopen($file, FOPEN_READ)) {
            return FALSE;
        }
        flock($fp, LOCK_SH); //读取之前加上共享锁
        $data = '';
        if (filesize($file) > 0) {
            $data = & fread($fp, filesize($file));
        }
        flock($fp, LOCK_UN); //释放锁
        fclose($fp);
        return $data;
    }
    function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE) {
        if (!$fp = @fopen($path, $mode)) {
            return FALSE;
        }
        flock($fp, LOCK_EX);
        fwrite($fp, $data);
        flock($fp, LOCK_UN);
        fclose($fp);
        return TRUE;
    }
    function is_really_writable($file) //兼容各平台判断文件是否有写入权限
    {
        // If we're on a Unix server with safe_mode off we call is_writable
        if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) {
            return is_writable($file);
        }
        // For windows servers and safe_mode "on" installations we'll actually
        // write a file then read it.  Bah...
        if (is_dir($file)) {
            $file = rtrim($file, '/') . '/' . md5(rand(1, 100));
            if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
                return FALSE;
            }
            fclose($fp);
            @chmod($file, DIR_WRITE_MODE);
            @unlink($file);
            return TRUE;
        } elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { //开源代码phprm.com
            return FALSE;
        }
        fclose($fp);
        return TRUE;
    }
}
$cache = new FileCache(30, 'cache/');
$cache->set('test', 'this is a test.');
print $cache->get('test');
/* End of file FlieCache.php */
?>

例3.自己觉得很好用的php文件缓存,代码如下:

<?php
class cache {
    private static $_instance = null;
    protected $_options = array(
        'cache_dir' => "./",
        'file_name_prefix' => 'cache',
        'mode' => '1', //mode 1 为serialize model 2为保存为可执行文件
        
    );
    /** 
     * 得到本类实例
     *
     * @return Ambiguous
     */
    public static function getInstance() {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    /** 
     * 得到缓存信息
     *
     * @param string $id
     * @return boolean|array
     */
    public static function get($id) {
        $instance = self::getInstance();
        //缓存文件不存在
        if (!$instance->has($id)) {
            return false;
        }
        $file = $instance->_file($id);
        $data = $instance->_fileGetContents($file);
        if ($data['expire'] == 0 || time() < $data['expire']) {
            return $data['contents'];
        }
        return false;
    }
    /** 
     * 设置一个缓存
     *
     * @param string $id   缓存id
     * @param array  $data 缓存内容
     * @param int    $cacheLife 缓存生命 默认为0无限生命
     */
    public static function set($id, $data, $cacheLife = 0) {
        $instance = self::getInstance();
        $time = time();
        $cache = array();
        $cache['contents'] = $data;
        $cache['expire'] = $cacheLife === 0 ? 0 : $time + $cacheLife;
        $cache['mtime'] = $time;
        $file = $instance->_file($id);
        return $instance->_filePutContents($file, $cache);
    }
    /** 
     * 清除一条缓存
     *
     * @param string cache id
     * @return void
     */
    public static function delete($id) {
        $instance = self::getInstance();
        if (!$instance->has($id)) {
            return false;
        }
        $file = $instance->_file($id);
        //删除该缓存
        return unlink($file);
    }
    /** 
     * 判断缓存是否存在
     *
     * @param string $id cache_id
     * @return boolean true 缓存存在 false 缓存不存在
     */
    public static function has($id) {
        $instance = self::getInstance();
        $file = $instance->_file($id);
        if (!is_file($file)) {
            return false;
        }
        return true;
    }
    /** 
     * 通过缓存id得到缓存信息路径
     * @param string $id
     * @return string 缓存文件路径
     */
    protected function _file($id) {
        $instance = self::getInstance();
        $fileNmae = $instance->_idToFileName($id);
        return $instance->_options['cache_dir'] . $fileNmae;
    }
    /** 
     * 通过id得到缓存信息存储文件名
     *
     * @param  $id
     * @return string 缓存文件名
     */
    protected function _idToFileName($id) {
        $instance = self::getInstance();
        $prefix = $instance->_options['file_name_prefix'];
        return $prefix . '---' . $id;
    }
    /** 
     * 通过filename得到缓存id
     *
     * @param  $id
     * @return string 缓存id
     */
    protected function _fileNameToId($fileName) {
        $instance = self::getInstance();
        $prefix = $instance->_options['file_name_prefix'];
        return preg_replace('/^' . $prefix . '---(.*)$/', '$1', $fileName);
    }
    /** 
     * 把数据写入文件
     *
     * @param string $file 文件名称
     * @param array  $contents 数据内容
     * @return bool
     */
    protected function _filePutContents($file, $contents) {
        if ($this->_options['mode'] == 1) {
            $contents = serialize($contents);
        } else {
            $time = time();
            $contents = "<?phpn" . " // mktime: " . $time . "n" . " return " . var_export($contents, true) . "n";
        }
        $result = false;
        $f = @fopen($file, 'w');
        if ($f) {
            @flock($f, LOCK_EX);
            fseek($f, 0);
            ftruncate($f, 0);
            $tmp = @fwrite($f, $contents);
            if (!($tmp === false)) {
                $result = true;
            }
            @fclose($f);
        }
        @chmod($file, 0777);
        return $result;
    }
    /** 
     * 从文件得到数据
     *
     * @param  sring $file
     * @return boolean|array
     */
    protected function _fileGetContents($file) {
        if (!is_file($file)) {
            return false;
        }
        if ($this->_options['mode'] == 1) {
            $f = @fopen($file, 'r');
            @$data = fread($f, filesize($file));
            @fclose($f);
            return unserialize($data);
        } else {
            return include $file;
        }
    }
    /** 
     * 构造函数
     */
    protected function __construct() {
    }
    /** 
     * 设置缓存路径
     *
     * @param string $path
     * @return self
     */
    public static function setCacheDir($path) {
        $instance = self::getInstance();
        if (!is_dir($path)) {
            exit('file_cache: ' . $path . ' 不是一个有效路径 ');
        }
        if (!is_writable($path)) {
            exit('file_cache: 路径 "' . $path . '" 不可写');
        }
        $path = rtrim($path, '/') . '/';
        $instance->_options['cache_dir'] = $path;
        return $instance;
    }
    /** 
     * 设置缓存文件前缀
     *
     * @param srting $prefix
     * @return self
     */
    public static function setCachePrefix($prefix) {
        $instance = self::getInstance();
        $instance->_options['file_name_prefix'] = $prefix;
        return $instance;
    }
    /** 
     * 设置缓存存储类型
     *
     * @param int $mode
     * @return self
     */
    public static function setCacheMode($mode = 1) {
        $instance = self::getInstance();
        if ($mode == 1) {
            $instance->_options['mode'] = 1;
        } else {
            $instance->_options['mode'] = 2;
        }
        return $instance;
    }
    /** 
     * 删除所有缓存
     * @return boolean
     */
    public static function flush() {
        $instance = self::getInstance();
        $glob = @glob($instance->_options['cache_dir'] . $instance->_options['file_name_prefix'] . '--*');
        if (emptyempty($glob)) {
            return false;
        }
        foreach ($glob as $v) {
            $fileName = basename($v);
            $id = $instance->_fileNameToId($fileName);
            $instance->delete($id);
        }
        return true;
    }
}
/* 初始化设置cache的配置信息什么的 */
cache::setCachePrefix('core'); //设置缓存文件前缀
cache::setCacheDir('./cache'); //设置存放缓存文件夹路径
//模式1 缓存存储方式
//a:3:{s:8:"contents";a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:34;i:4;i:5;i:5;i:6;i:6;i:6;}s:6:"expire";i:0;s:5:"mtime";i:1318218422;}
//模式2 缓存存储方式
/*
 <?php 
 // mktime: 1318224645 
 return array ( 
  'contents' =>  
  array ( 
    0 => 1, 
    1 => 2, 
    2 => 3, 
    3 => 34, 
    4 => 5, 
    5 => 6, 
    6 => 6, 
  ), 
  'expire' => 0, 
  'mtime' => 1318224645, 
) 
 *  
 *  
*/
cache::setCacheMode('2');
if (!$row = cache::get('zj2')) {
    array(1,2,3,34,5,6,6); 
    $row = cache::set('zj2', $array);
}
// cache::flush(); 清空所有缓存
print_r($row);
?>
<?php
/** 
 * 文件缓存类
 * @author  xiaojiong & 290747680@qq.com
 * @date 2011-08-17
 */
class cache {
    const FILE_LIFE_KEY = 'FILE_LIFE_KEY';
    const CLEAR_ALL_KEY = 'CLEAR_ALL';
    static $_instance = null;
    protected $_options = array(
        'cache_dir' => './cache',
        'file_locking' => true,
        'file_name_prefix' => 'cache',
        'cache_file_umask' => 0777,
        'file_life' => 100000
    );
    static function &getInstance($options = array()) {
        if (self::$_instance === null) {
            self::$_instance = new self($options);
        }
        return self::$_instance;
    }
    /** 
     * 设置参数
     * @param  array $options 缓存参数
     * @return void
     */
    static function &setOptions($options = array()) {
        return self::getInstance($options);
    }
    /** 
     * 构造函数
     * @param  array $options 缓存参数
     * @return void
     */
    private function __construct($options = array()) {
        if ($this->_options['cache_dir'] !== null) {
            $dir = rtrim($this->_options['cache_dir'], '/') . '/';
            $this->_options['cache_dir'] = $dir;
            if (!is_dir($this->_options['cache_dir'])) {
                mkdir($this->_options['cache_dir'], 0777, TRUE);
            }
            if (!is_writable($this->_options['cache_dir'])) {
                exit('file_cache: 路径 "' . $this->_options['cache_dir'] . '" 不可写');
            }
        } else {
            exit('file_cache: "options" cache_dir 不能为空 ');
        }
    }
    /** 
     * 设置缓存路径
     * @param  string  $value
     * @return void
     */
    static function setCacheDir($value) {
        $self = & self::getInstance();
        if (!is_dir($value)) {
            exit('file_cache: ' . $value . ' 不是一个有效路径 ');
        }
        if (!is_writable($value)) {
            exit('file_cache: 路径 "' . $value . '" 不可写');
        }
        $value = rtrim($this->_options['cache_dir'], '/') . '/';
        $self->_options['cache_dir'] = $value;
    }
    /** 
     * 存入缓存数据
     * @param  array  $data          放入缓存的数据
     * @param  string $id            缓存id(又名缓存识别码)
     * @param  cache_life            缓存时间
     * @return boolean True if no problem
     */
    static function save($data, $id = null, $cache_life = null) {
        $self = & self::getInstance();
        if (!$id) {
            if ($self->_id) {
                $id = $self->_id;
            } else {
                exit('file_cache:save() id 不能为空!');
            }
        }
        $time = time();
        if ($cache_life) {
            $data[self::FILE_LIFE_KEY] = $time + $cache_life;
        } elseif ($cache_life != 0) {
            $data[self::FILE_LIFE_KEY] = $time + $self->_options['file_life'];
        }
        $file = $self->_file($id);
        $data = "<?phpn" . " // mktime: " . $time . "n" . " return " . var_export($data, true) . "n";
        $res = $self->_filePutContents($file, $data);
        return $res;
    }
    /** 
     * 得到缓存信息
     *
     * @param  string  $id  缓存id
     * @return string|array 缓存数据
     */
    static function load($id) {
        $self = & self::getInstance();
        $time = time();
        //检测缓存是否存在
        if (!$self->test($id)) {
            // The cache is not hit !
            return false;
        }
        //全部清空识别文件
        $clearFile = $self->_file(self::CLEAR_ALL_KEY);
        $file = $self->_file($id);
        //判断缓存是否已被全部清除
        if (is_file($clearFile) && filemtime($clearFile) > filemtime($file)) {
            return false;
        }
        $data = $self->_fileGetContents($file);
        if (emptyempty($data[self::FILE_LIFE_KEY]) || $time < $data[self::FILE_LIFE_KEY]) {
            unset($data[self::FILE_LIFE_KEY]);
            return $data;
        }
        return false;
    }
    /** 
     * 写入缓存文件
     *
     * @param  string $file   缓存路径
     * @param  string $string 缓存信息
     * @return boolean true 成功
     */
    protected function _filePutContents($file, $string) {
        $self = & self::getInstance();
        $result = false;
        $f = @fopen($file, 'ab+');
        if ($f) {
            if ($self->_options['file_locking']) @flock($f, LOCK_EX);
            fseek($f, 0);
            ftruncate($f, 0);
            $tmp = @fwrite($f, $string);
            if (!($tmp === false)) {
                $result = true;
            }
            @fclose($f);
        }
        @chmod($file, $self->_options['cache_file_umask']);
        return $result;
    }
    /** 
     * 格式化后的缓存文件路径
     *
     * @param  string $id 缓存id
     * @return string 缓存文件名(包括路径)
     */
    protected function _file($id) {
        $self = & self::getInstance();
        $fileName = $self->_idToFileName($id);
        return $self->_options['cache_dir'] . $fileName;
    }
    /** 
     * 格式化后的缓存文件名字
     *
     * @param  string $id 缓存id
     * @return string 缓存文件名
     */
    protected function _idToFileName($id) {
        $self = & self::getInstance();
        $self->_id = $id;
        $prefix = $self->_options['file_name_prefix'];
        $result = $prefix . '---' . $id;
        return $result;
    }
    /** 
     * 判断缓存是否存在
     *
     * @param  string $id Cache id
     * @return boolean True 缓存存在 False 缓存不存在
     */
    static function test($id) {
        $self = & self::getInstance();
        $file = $self->_file($id);
        if (!is_file($file)) {
            return false;
        }
        return true;
    }
    /** 
     * 得到缓存信息
     *
     * @param  string $file 缓存路径
     * @return string 缓存内容
     */
    protected function _fileGetContents($file) {
        if (!is_file($file)) {
            return false;
        }
        return include $file;
    }
    /** 
     * 清除所有缓存
     *
     * @return void
     */
    static function clear() {
        $self = & self::getInstance();
        $self->save('CLEAR_ALL', self::CLEAR_ALL_KEY);
    }
    /** 
     * 清除一条缓存
     *
     * @param string cache id
     * @return void
     */
    static function del($id) {
        $self = & self::getInstance();
        if (!$self->test($id)) {
            // 该缓存不存在
            return false;
        }
        $file = $self->_file($id);
        return unlink($file);
    }
}
?>

存入数据 

<?php
$config = array(
    'name' => 'xiaojiong',
    'qq' => '290747680',
    'age' => '20',
);
//第一个参数 缓存data
//第二个参数 缓存id
//第三个参数 cache_life 0 永不过期(cache::clear()清空所有除外) 默认cache_life 为option_cache_life
cache::save($config, 'config', 0);
?>


载入数据 

<?php
//只有一个参数 cache_id
$config = cache::load('config');
?>

清空缓存 

<?php
//清空指定缓存
cache::del('config');
//清空所有缓存
cache::clear();
cache信息配置
//在执行所有cache_func前调用
$_options = array(
    'cache_dir' => './cache', //缓存文件目录
    'file_name_prefix' => 'cache', //缓存文件前缀
    'file_life' => 100000, //缓存文件生命
    
);
cache::setOptions($options);
//再执行 就会按着新配置信息执行,否则是默认信息
cache::save($arr, 'arr');
//就是这个方法 貌似不合理 望大家指点


本文地址:http://www.phprm.com/develop/fs4839.html

转载随意,但请附上文章地址:-)

标签:php文件缓存 php缓存类

相关文章

发表留言