PHP缓存技术
参考shindig的缓存类和apc。
Php代码
<?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- <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文件,并以""开首
*
* @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, '<!--?php return ' . var_export($value, true). ';');
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
- 1SEO是前提建站考虑 建站过程容易吗
- 2写好分享类文章打造百万流量
- 3信息化管理,进销存软件选择且行且谨慎!
- 4用垃圾站点流量也能做出正规网站
- 5确定网站的关键词的几个重要因素
- 6企业网站优化方案
- 7五步让你成为SEO高手
- 8宝鸡网站建设教你如何良好的进行企业网站建设
- 9怎样购买链接
- 10PHP 5.4 相关知识
- 11怎样提升网站关键词排名
- 12优秀的OA软件应具备的五大特性
- 13使用纳客会员管理系统遇到的问题(问答四)
- 14网站收录及关键词排名分析
- 15如何通过优化网站何提升网站的转化率
- 16怎样快速换到合适的友情链接
- 1710个让你意想不到的退烧小偏方
- 18电热水器燃气热水器性能对比
- 19PHP5.3作废函数的处理方法
- 20合肥最好的网络公司告诉大家快速提高网站权重
- 21优化需要找到适合办法
- 22什么是Seo策略
- 23企业如何注册有新意的域名?
- 24草根站长必读网站运营如何做好策划工作
- 25巴马浓缩液一盒多少钱,巴马汤浓缩液效果如何
- 26如何建立APP端整体形象
- 27资料的整理过程实质上是资料的辨析过程
- 28虚拟主机的用途
- 29消费者在选购空调时应综合考虑以下因素
- 30网站搜索引擎优化和收录