<?php |
final class FileCache |
{ |
/** |
* * * 缓存目录 * |
* |
* @var string |
*/ |
private static $msCachePath = null; |
/** |
* * * 默认缓存失效时间(1小时) * |
* |
* @var int |
*/ |
const miEXPIRE = 3600; |
/** |
* * * 构造<br /> * self::$msCachePath 缓存目录为共享目录 * |
* |
* @param string $sCachePath |
*/ |
function __construct( $sCachePath = './tmp/' ) |
{ |
if ( is_null (self :: $msCachePath )) |
self :: $msCachePath = $sCachePath ; |
} |
/** |
* * * 读取缓存<br /> * 返回: 缓存内容,字符串或数组;缓存为空或过期返回null * |
* |
* @param string $sKey 缓存键值(无需做md5()) * |
* @return string | null * |
* @access public |
*/ |
public function get( $sKey ) |
{ |
if ( empty ( $sKey )) |
return false; |
$sFile = self :: getFileName( $sKey ); |
if (! file_exists ( $sFile )) |
return null; |
else |
{ |
$handle = fopen ( $sFile , 'rb' ); |
if ( intval ( fgets ( $handle )) > time()) |
{ |
// 检查时间戳 { //未失效期,取出数据 |
$sData = fread ( $handle , filesize ( $sFile )); |
fclose( $handle ); |
return unserialize( $sData ); |
} |
else |
{ |
// 已经失效期 |
fclose( $handle ); |
return null; |
} |
} |
} |
/** |
* 写入缓存 * * |
* |
* @param string $sKey 缓存键值 * |
* @param mixed $mVal 需要保存的对象 * |
* @param int $iExpire 失效时间 * |
* @return bool |
* @access public |
*/ |
public function set( $sKey , $mVal , $iExpire = null) |
{ |
if ( empty ( $sKey )) |
return false; |
$sFile = self :: getFileName( $sKey ); |
if (! file_exists (dirname( $sFile ))) |
if (!self :: is_mkdir(dirname( $sFile ))) |
return false; |
$aBuf = array (); |
$aBuf [] = time() + (( empty ( $iExpire )) ? self :: miEXPIRE : intval ( $iExpire )); |
$aBuf [] = serialize( $mVal ); |
/** |
* 写入文件操作 |
*/ |
$handle = fopen ( $sFile , 'wb' ); |
fwrite( $handle , implode( "\\n" , $aBuf )); |
fclose( $handle ); |
return true; |
} |
/** |
* * * 删除指定的缓存键值 * |
* |
* @param string $sKey 缓存键值 |
* @return bool |
*/ |
public function del( $sKey ) |
{ |
if ( empty ( $sKey )) |
return false; |
else |
{ |
@unlink (self :: getFileName( $sKey )); |
return true; |
} |
} |
/** |
* * * 获取缓存文件全路径<br /> * 返回: 缓存文件全路径<br /> * $sKey的值会被转换成md5(),并分解为3级目录进行访问 * |
* |
* @param string $sKey 缓存键 * |
* @return string |
* @access protected |
*/ |
private static function getFileName( $sKey ) |
{ |
if ( empty ( $sKey )) return false; |
$key_md5 = md5( $sKey ); |
/** |
* $aFileName = array(); |
* $aFileName[] = rtrim(self :: $msCachePath, '/'); |
* $aFileName[] = $key_md5{0} . $key_md5{1}; |
* $aFileName[] = $key_md5{2} . $key_md5{3}; |
* $aFileName[] = $key_md5{4} . $key_md5{5}; |
* $aFileName[] = $key_md5; |
*/ |
return self :: $msCachePath . '/' . $key_md5 ; |
// return implode('/', $aFileName); |
} |
/** |
* * * 创建目录<br /> * * |
* |
* @param string $sDir |
* @return bool |
*/ |
private static function is_mkdir( $sDir = '' ) |
{ |
if ( empty ( $sDir )) |
return false; |
/** |
* 如果无法创建缓存目录,让系统直接抛出错误提示 |
*/ |
echo $sDir ; |
if (! mkdir ( $sDir , 0666)) |
return false; |
else |
return true; |
} |
} |
//该片段来自于http://yuncode.net |