继续说缓存,从缓存对象来看,第一种缓存技术缓存了页面片段,难免造成缓存的对象比较臃肿,于是便有人把程序中的变量(也许经过序列化),通过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<cndingo@qq.com> * @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); } }