灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2732回复:0

PHP缓存技术实现

楼主#
更多 发布于:2012-09-12 06:49

发个php缓存实现,实现了apc和文件缓存,继承Cache_Abstract即可实现调用第三方的缓存工具。
  参考shindig的缓存类和apc。
  php代码
  <?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-
  * @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, '
  return @file_put_contents($cacheFile, '' . 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





喜欢0 评分0
游客

返回顶部