继续说缓存,从缓存对象来看,第一种缓存技术缓存了页面片段,难免造成缓存的对象比较臃肿,于是便有人把程序中的变量(也许经过序列化),通过fwrite()或者file_put_contents()写入到文件中,同样通过设定过期时间来确保缓存的有效性,此外还引人了主动缓存和被动缓存的概念(如discuz所见)。此方法避免使用ob系列函数,提升了部分效率,特别是在虚拟主机下。其实现方法如下,转自一国产框架:
/**
* Punny - The most easy-to-use PHP MVC framework
* http://punny.skiyo.cn/
*
* Copyright (c) 2009 Jessica(董立强)
* Licensed under the MIT license.
*
* @author Jessica
* @version $Id: FileCache.class.php 267 2010-01-19 07:21:08Z jessica.dlq $
*/
class FileCache {
/**
* 缓存目录
*
* @var string
* @access private
*/
private $dir;
/**
* 构造器
*
* @access public
*/
public function __construct() {
$this->dir = 'cache/'; //缓存目录
@chmod($this->dir, 0777);
if(!is_writable($this->dir)) {
throw new Exception('缓存文件夹' . $this->dir . '不可写!');
}
}
/**
* 设置一个缓存变量
*
* @param String $key 缓存Key
* @param mixed $value 缓存内容
* @param int $expire 缓存时间(秒)
* @return boolean 是否缓存成功
* @access public
* @abstract
*/
public function set($key, $value, $expire = 60) {
$file = $this->dir . md5($key) . '.cache';
if(file_put_contents($file , serialize($value), LOCK_EX)) {
@touch($file, time() + $expire);
return true;
} else {
return false;
}
}
/**
* 获取一个已经缓存的变量
*
* @param String $key 缓存Key
* @return mixed 缓存内容
* @access public
*/
public function get($key) {
$file = $this->dir . md5($key) . '.cache';
if(is_file($file)) {
if(time() <= filemtime($file)) {
return unserialize(file_get_contents($file));
} else {
@unlink($file);
//删除缓存
return false;
}
} else {
//没有找到缓存
return false;
}
}
/**
* 删除一个已经缓存的变量
*
* @param $key
* @return boolean 是否删除成功
* @access public
*/
public function del($key) {
$file = $this->dir . md5($key) . '.cache';
return @unlink($file);
}
/**
* 删除全部缓存变量
*
* @return boolean 是否删除成功
* @access public
*/
public function delAll() {
$files = scandir($this->dir);
$files = array_diff($files, array('.', '..'));
foreach($files as $file) {
@unlink($file);
}
return true;
}
/**
* 检测是否存在对应的缓存
*
* @param string $key 缓存Key
* @return boolean 是否存在key
* @access public
*/
public function has($key) {
return (is_file($this->dir . md5($key) . '.cache') === NULL ? false : true);
}
}
0 Responses to “PHP常用缓存技术详解(二)”