一个PHP小数据缓存类,可见的控制缓存文件数量。

小竣 日常收集2,394阅读模式
一个PHP小数据缓存类,可见的控制缓存文件数量。

一个PHP小数据缓存类,可见的控制缓存文件数量。

使用方法

require "Cache.class.php";
header("Content-type: text/html; charset=utf-8");

// 设置示例 重置缓存目录
Cache::$Config['Cache_Dir'] = './.Cache';

// 使用方法示例
$data = S('TangShi_LiBai/ChuHe');

if(!$data){
	$data = array(
		'Name' => "锄禾",
		'Author' => "李白",
		'Contents' => "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。",
		'Time' => time()
	);
	$ret = S('TangShi_LiBai/ChuHe', $data, 60);
	
}
print_r($data);

// 删除缓存信息
// S("TangShi_LiBai/ChuHe", NULL);

Cache.class.php

/**
* 文件缓存系统
*
* 普通Cache缓存类,适用于大量零碎小数据缓存。大文件缓存不适用。
*
* 特点:缓存文件分目录储存,防止单个目录下文件过多导致IO效率变低。
* 		可以控制子目录数,文件数始终在一个可以预见的数量范围之内。
*
* 说明:
* @author 青石 <www@qs5.org> http://www.qs5.org
* @version 0.1 完成于 2015/6/8
*
*/
class Cache {

	// 定义类默认设置
	static $Config = array(
		'Cache_Dir'			=> './Cache',	// 默认保存目录
		'File_Life'			=> 86400,		// 默认缓存有效时间 24小时 单位(s)
		'File_Suffix'		=> '.Cache.php',// 默认缓存文件名后缀 建议使用 .php 结尾
		'Group_Dir_Size'	=> -3,			// 文件夹分组命名字符节数	必须使用负数 设置为0则不分子文件夹
		'Group_File_Size'	=> 4,			// 文件名字命名字符节数	目录下文件数会限制在 16的N次方
		'Group_Dir_Depr'	=> '_',			// 分类多级目录替换符 为空则不分级
		);

	// 保存缓存信息
	static public function save($Name, $Data, $Time = 0){
		if(strlen($Name) < 1) return false;

		$path = self::_getPathName($Name);
		if(!self::_mkDir($path['dir'])){
			die('<b>Error</b>: Create a cache directory fails, check whether write permission.');
		}
		$Time = (($Time == 0) ? self::$Config['File_Life'] : $Time) + time();
		if(is_file($path['path'])){
			$file_str = file($path['path']);
			$file_str = $file_str[1];
			$file_info = unserialize($file_str);
		}
		$file_info[$path['hash']] = array('n' => $Name, 't' => $Time, 'd' => $Data);
		$file_text = "<?php exit; ?>\n" . serialize($file_info);
		if(!file_put_contents($path['path'], $file_text, LOCK_EX)){
			return false;
		}
		return true;
	}

	// 读取缓存信息
	static public function read($Name){
		if(strlen($Name) < 1) return false;

		$path = self::_getPathName($Name);
		if(!is_file($path['path'])){
			return NULL;
		}
		$file_info = file($path['path']);
		$ret_info = unserialize($file_info[1]);
		$ret_info = $ret_info[$path['hash']];
		if($ret_info['t'] < time()){
			self::del($Name);
			return NULL;
		}
		return $ret_info['d'];
	}

	// 删除缓存信息
	static public function del($Name){
		if(strlen($Name) < 1) return false;

		$path = self::_getPathName($Name);
		if(!is_file($path['path'])){
			return true;
		}
		$file_info = file($path['path']);
		$ret_info = unserialize($file_info[1]);
		unset($ret_info[$path['hash']]);

		// 保存信息
		$file_text = "<?php exit; ?>\n" . serialize($ret_info);
		if(!file_put_contents($path['path'], $file_text, LOCK_EX)){
			return false;
		}
		return true;
	}

	// 私有方法 循环创建目录
	static private function _mkDir($dir, $mode = 0666){
		if(is_dir($dir)){
			return true;
		}else if(!is_dir(dirname($dir)) && !self::_mkDir(dirname($dir), $mode)){
			return false;
		}
		return mkdir($dir, $mode);
	}

	// 私有方法 获取文件目录与关键字信息
	static private function _getPathName($Name){
		$path = explode('/', $Name);	// 分解名称
		if(count($path)<=1){
			$path = array('', $path[0]);
		}else{
			$path[0] = str_replace(self::$Config['Group_Dir_Depr'], '/', $path[0]) . '/';
		}
		$ret_path['hash'] = md5(strtolower($Name));
		$ret_path['dir'] = self::$Config['Cache_Dir'] . '/' . $path[0] . (self::$Config['Group_Dir_Size'] < 0 ? substr($ret_path['hash'], self::$Config['Group_Dir_Size']) . '/' : '');
		$ret_path['name'] = substr($ret_path['hash'], 0, self::$Config['Group_File_Size']) . self::$Config['File_Suffix'];
		$ret_path['path'] = $ret_path['dir'] . $ret_path['name'];
		return $ret_path;
	}
}
// 封装成快捷调用方法 S(); 可根据需要更改方法名
function S($Name, $Data = '', $time = 0){

	if(strlen($Name) < 1) return false;
	if($Data == ''){
		return Cache::read($Name);
	}elseif($Data == NULL){
		return Cache::del($Name);
	}else{
		return Cache::save($Name, $Data, $time);
	}
}

 

weinxin
我的微信
我的微信
微信扫一扫