静态缓存,包含失效时间

静态缓存,包含失效时间

<?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);
    }
}

?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值