PHP常用缓存技术详解(二)

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


  • No Comments

Leave a Reply