php 缓存类

本文详细介绍了APC缓存扩展和文件缓存的实现方式,包括存储、读取、清除、删除缓存操作及缓存锁定与解锁机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    <?php  
    class CacheException extends Exception {}  
    /** 
     * 缓存抽象类 
     */  
    abstract class Cache_Abstract {  
        /** 
         * 读缓存变量 
         * 
         * @param string $key 缓存下标 
         * @return mixed 
         */  
        abstract public function fetch($key);  
          
        /** 
         * 缓存变量 
         * 
         * @param string $key 缓存变量下标 
         * @param string $value 缓存变量的值 
         * @return bool 
         */  
        abstract public function store($key, $value);  
          
        /** 
         * 删除缓存变量 
         * 
         * @param string $key 缓存下标 
         * @return Cache_Abstract 
         */  
        abstract public function delete($key);  
          
        /** 
         * 清(删)除所有缓存 
         * 
         * @return Cache_Abstract 
         */  
        abstract public function clear();  
          
        /** 
         * 锁定缓存变量 
         * 
         * @param string $key 缓存下标 
         * @return Cache_Abstract 
         */  
        abstract public function lock($key);  
      
        /** 
         * 缓存变量解锁 
         * 
         * @param string $key 缓存下标 
         * @return Cache_Abstract 
         */  
        abstract public function unlock($key);  
      
        /** 
         * 取得缓存变量是否被锁定 
         * 
         * @param string $key 缓存下标 
         * @return bool 
         */  
        abstract public function isLocked($key);  
      
        /** 
         * 确保不是锁定状态 
         * 最多做$tries次睡眠等待解锁,超时则跳过并解锁 
         * 
         * @param string $key 缓存下标 
         */  
        public function checkLock($key) {  
            if (!$this->isLocked($key)) {  
                return $this;  
            }  
              
            $tries = 10;  
            $count = 0;  
            do {  
                usleep(200);  
                $count ++;  
            } while ($count <= $tries && $this->isLocked($key));  // 最多做十次睡眠等待解锁,超时则跳过并解锁  
      
            $this->isLocked($key) && $this->unlock($key);  
              
            return $this;  
        }  
    }  
      
      
    /** 
     * APC扩展缓存实现 
     *  
     *  
     * @category   Mjie 
     * @package    Cache 
     * @author     流水孟春 
     * @copyright  Copyright (c) 2008- <cmpan(at)qq.com> 
     * @license    New BSD License 
     * @version    $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $ 
     */  
    class Cache_Apc extends Cache_Abstract {  
          
        protected $_prefix = 'cache.mjie.net';  
          
        public function __construct() {  
            if (!function_exists('apc_cache_info')) {  
                throw new CacheException('apc extension didn\'t installed');  
            }  
        }  
          
        /** 
         * 保存缓存变量 
         * 
         * @param string $key 
         * @param mixed $value 
         * @return bool 
         */  
        public function store($key, $value) {  
            return apc_store($this->_storageKey($key), $value);  
        }  
          
        /** 
         * 读取缓存 
         * 
         * @param string $key 
         * @return mixed 
         */  
        public function fetch($key) {  
            return apc_fetch($this->_storageKey($key));  
        }  
          
        /** 
         * 清除缓存 
         * 
         * @return Cache_Apc 
         */  
        public function clear() {  
            apc_clear_cache();  
            return $this;  
        }  
          
        /** 
         * 删除缓存单元 
         * 
         * @return Cache_Apc 
         */  
        public function delete($key) {  
            apc_delete($this->_storageKey($key));  
            return $this;  
        }  
          
        /** 
         * 缓存单元是否被锁定 
         * 
         * @param string $key 
         * @return bool 
         */  
        public function isLocked($key) {  
            if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {  
                return false;  
            }  
              
            return true;  
        }  
          
        /** 
         * 锁定缓存单元 
         * 
         * @param string $key 
         * @return Cache_Apc 
         */  
        public function lock($key) {  
            apc_store($this->_storageKey($key) . '.lock', '', 5);  
            return $this;  
        }  
          
        /** 
         * 缓存单元解锁 
         * 
         * @param string $key 
         * @return Cache_Apc 
         */  
        public function unlock($key) {  
            apc_delete($this->_storageKey($key) . '.lock');  
            return $this;  
        }  
          
        /** 
         * 完整缓存名 
         * 
         * @param string $key 
         * @return string 
         */  
        private function _storageKey($key) {  
            return $this->_prefix . '_' . $key;  
        }  
    }  
      
    /** 
     * 文件缓存实现 
     *  
     *  
     * @category   Mjie 
     * @package    Cache 
     * @author     流水孟春 
     * @copyright  Copyright (c) 2008- <cmpan(at)qq.com> 
     * @license    New BSD License 
     * @version    $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $ 
     */  
    class Cache_File extends Cache_Abstract {  
        public $useSubdir     = false;  
          
        protected $_cachesDir = 'cache';  
          
        public function __construct() {  
            if (defined('DATA_DIR')) {  
                $this->_setCacheDir(DATA_DIR . '/cache');  
            }  
        }  
          
        /** 
         * 获取缓存文件 
         * 
         * @param string $key 
         * @return string 
         */  
        protected function _getCacheFile($key) {  
            $subdir = $this->useSubdir ? substr($key, 0, 2) . '/' : '';  
            return $this->_cachesDir . '/' . $subdir . $key . '.php';  
        }  
      
        /** 
         * 读取缓存变量 
         * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头 
         *  
         * @param string $key 缓存下标 
         * @return mixed 
         */  
        public function fetch($key) {  
            $cacheFile = self::_getCacheFile($key);  
            if (file_exists($cacheFile) && is_readable($cacheFile)) {  
                // include 方式  
                //return include $cacheFile;  
                // 系列化方式  
      
                return unserialize(@file_get_contents($cacheFile, false, NULL, 13));  
            }  
      
            return false;  
        }  
      
        /** 
         * 缓存变量 
         * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头 
         * 
         * @param string $key 缓存变量下标 
         * @param string $value 缓存变量的值 
         * @return bool 
         */  
        public function store($key, $value) {  
            $cacheFile = self::_getCacheFile($key);  
            $cacheDir  = dirname($cacheFile);  
      
            if(!is_dir($cacheDir)) {  
                if(!@mkdir($cacheDir, 0755, true)) {  
                    throw new CacheException("Could not make cache directory");  
                }  
            }  
        // 用include方式  
            //return @file_put_contents($cacheFile, '<?php return ' . var_export($value, true). ';');  
      
            return @file_put_contents($cacheFile, '<?php exit;?>' . serialize($value));  
        }  
      
        /** 
         * 删除缓存变量 
         * 
         * @param string $key 缓存下标 
         * @return Cache_File 
         */  
        public function delete($key) {  
            if(emptyempty($key)) {  
                throw new CacheException("Missing argument 1 for Cache_File::delete()");  
            }  
              
            $cacheFile = self::_getCacheFile($key);  
            if(!@unlink($cacheFile)) {  
                throw new CacheException("Cache file could not be deleted");  
            }  
      
            return $this;  
        }  
      
        /** 
         * 缓存单元是否已经锁定 
         * 
         * @param string $key 
         * @return bool 
         */  
        public function isLocked($key) {  
            $cacheFile = self::_getCacheFile($key);  
            clearstatcache();  
            return file_exists($cacheFile . '.lock');  
        }  
      
        /** 
         * 锁定 
         * 
         * @param string $key 
         * @return Cache_File 
         */  
        public function lock($key) {  
            $cacheFile = self::_getCacheFile($key);  
            $cacheDir  = dirname($cacheFile);  
            if(!is_dir($cacheDir)) {  
                if(!@mkdir($cacheDir, 0755, true)) {  
                    if(!is_dir($cacheDir)) {  
                        throw new CacheException("Could not make cache directory");  
                    }  
                }  
            }  
      
            // 设定缓存锁文件的访问和修改时间  
            @touch($cacheFile . '.lock');  
            return $this;  
        }  
        
        /** 
         * 解锁 
         * 
         * @param string $key 
         * @return Cache_File 
         */  
        public function unlock($key) {  
            $cacheFile = self::_getCacheFile($key);  
            @unlink($cacheFile . '.lock');  
            return 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值