静态缓存,包含失效时间
<?php
/**
* Created by PhpStorm.
* User: 郑江
* Date: 2018/10/9
* Time: 19:15
*/
/**
* Class File 静态缓存类
*/
class File{
//设置缓存目录
private $_dir;
//设置文件后缀
const EXT=".txt";
public function __construct(){
//设置缓存文件所储存的位置是 当前文件夹下的files文件夹下面
$this->_dir=dirname(__FILE__).'/files/';
}
/**
* 函数功能:生成缓存(把数据写道指定的文件中,当$value有值传入的时候)
* 获取缓存(从缓存文件里读数据,当$value为空的时候)
* 删除缓存(删除缓存文件 ,当$value为 NULL)
* @param $key 相当于文件名
* @param string $value 文件里要存放的值
* @param integer $cacheTime 缓存失效时间 当调用的时候不穿值,表示永久有效
* 缓存失效时间原理:把$cacheTime和$value一并存到文件里,下次读取文件的时候
* 只要读取文件里的失效时间加上文件本生的创建时间,和当先系统时间进行比较。
* 若时系统时间小于前面两者的时间和,则表示缓存未失效。反之则是缓存失效了
* 缓存失效,删除缓存文件;缓存未失效,json_decode()后返回出去
* @return
*/
public function cacheData($key,$value="",$cacheTime=0){
//组装文件名(包含缓存目录,目录下的文件地址,文件名称,以及文件后缀)
$filename=$this->_dir.$key.self::EXT;
//当value值不为空时,注意这里是强等
//当是两个等于时,null==""是真的
if($value!==""){
//当$value为 Null 表示把这个缓存给删了
if(is_null($value)){
//删除文件,并过滤警告
return @unlink($filename);
}
//$value不为null 也不为"" 表示要生成缓存
//获取要缓存的文件目录,看目录存不存在
$dir=dirname($filename);
//当目录不存在时,手动创建目录
//这里只是创建个目录,相应的缓存文件 file_put_contents() 会来创建
if(!is_dir($dir)){
//最好递归创建
mkdir($dir,0777,true);
}
//设置缓存失效时间为11位,不满11位前面补零,有固定的长度格式,获取也比较方便些
//下次取缓存时间的时候,就只要 file_get_contents($filename) 获取文件内容 ,并 substr()前11个字符,
//就是储存缓存失效时间的字符了
$cacheTime=sprintf("%011d",$cacheTime);
//把数据写入文件中,json_encode()会将数组转换成字符串形式
//这里用的是 json_encode()把数据转换成json格式的字符串
//这里的file_put_contents会自动创建一个文件
//文件写入成功,返回字节数。不成功返回false;
//再把$cacheTime缓存失效时间给拼加到json_encode之后的字符串之前
return file_put_contents($filename,$cacheTime . json_encode($value));
}
//下面是当$value值为空时,表示我现在要获取缓存
//当要获取的文件不存在的时候
if(!is_file($filename)){
return FALSE;
}
//下面开始取数据,由于放入文件的字符串格式是 (一串代表cacheTime的普通字符串)+(一串json格式的储存信息的字符串)
//1 取出缓存文件里的内容
$content=file_get_contents($filename);
//2 先取出储存cacheTime的字段,int后代表缓存失效时间
$cacheTime=(int)substr($content,0,11);
//3 取出缓存文件中真实的value值,从11位到最后一位
$value=substr($content,11);
//判断缓存文件是否失效
//当缓存设置时间+文件最后一次修改时间 < 系统时间时,即为缓存失效
//此时要做判断,当$cacheTime==0 表示永久有效
if($cacheTime!=0&&($cacheTime+filemtime($filename)<time())){
//删除缓存文件,返回false;
unlink($filename);
return false;
}
//当缓存未失效,把文件里的json格式数据 重新格式化后,以数组的形式返回
return json_decode($value,true);
}
}
?>