发个php缓存实现,实现了apc和文件缓存,继承cache_abstract即可实现调用第三方的缓存工具。
参考shindig的缓存类和apc。
php代码
islocked($key)) { return $this; } $tries = 10; $count = 0; do { usleep(200); $count ++; } while ($count islocked($key)); // 最多做十次睡眠等待解锁,超时则跳过并解锁 $this->islocked($key) && $this->unlock($key); return $this; } } /** * apc扩展缓存实现 * * * @category mjie * @package cache * @author 流水孟春 * @copyright copyright (c) 2008- * @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- * @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文件,并以开头 * * @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文件,并以开头 * * @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, 'http://www.bkjia.com/phpjc/735086.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/735086.htmltecharticle发个php缓存实现,实现了apc和文件缓存,继承cache_abstract即可实现调用第三方的缓存工具。 参考shindig的缓存类和apc。 php代码 ?php classcachee...