文档章节

发布个PHP的文件缓存类

David
 David
发布于 2016/07/11 14:50
字数 468
阅读 21
收藏 0

网上找过PHP的文件缓存类,可觉得都不适合自己使用,自己写了一个。没测试过性能。

<?php
/**
 * File : FileCache.php
 * Author : David
 * Date : 2016/07/09
 * Remark : 文件缓存类
 */
class FileCache
{
    protected $cache_dir = '';
    protected $validtime = 0;

    public function __construct($dir = null)
    {
        $this->cache_dir = DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR;
        $this->cache_dir = $_SERVER['DOCUMENT_ROOT'] . $this->cache_dir;
        if (! file_exists($this->cache_dir)) {
            $this->mkDirs($this->cache_dir) ? '' : exit('创建 ' . $this->cache_dir . ' 目录权限不足');
        }
    }

    /**
     * 设置缓存
     * @param $key
     * @param $value
     * @param null $validtime
     * @return bool
     */
    public function set($key, $value, $validtime = null)
    {
        if ($validtime) {
            $this->validtime = $validtime;
        }
        $data = $this->getTempValue($key, $value, $this->validtime);
        $full_file_path = $this->getFullFilePath($this->getFileName($key));
        if (file_exists($full_file_path)) {
            unlink($full_file_path);
        }
        if (file_put_contents($full_file_path, $data)) {
            return true;
        }
        return false;
    }

    /**
     * 获取缓存内容
     * @param $key
     * @return null
     */
    public function get($key)
    {
        $full_file_path = $this->getFullFilePath($this->getFileName($key));
        if (file_exists($full_file_path)) {
            $data = $this->getCacheValue(file_get_contents($full_file_path));
            // 判断是否过期
            if (intval($data['validtime']) === 0) { // 不过期
                return $data['value'];
            }
            if ($data['creattime'] + $data['validtime'] > time()) { // 时间未过期
                return $data['value'];
            } else {
                unlink($full_file_path);
            }
        }
        return null;
    }

    /**
     * 删除单个缓存文件
     * @param $key
     * @return bool
     */
    public function del($key)
    {
        $full_file_path = $this->getFullFilePath($this->getFileName($key));
        if (file_exists($full_file_path) && unlink($full_file_path)) {
            return true;
        }
        return false;
    }

    /**
     * 删除全部缓存文件
     * @return bool
     */
    public function delAll()
    {
        $files = $this->getDir();
        if (count($files)) {
            foreach ($files as $key => $val) {
                @unlink($this->cache_dir . $val);
            }
        }
        return true;
    }

    /**
     * 获取模板内容
     * @param $key
     * @param $value
     * @param $validtime
     * @return string
     */
    protected function getTempValue($key, $value, $validtime)
    {
        $temp['key'] = $key;
        $temp['creattime'] = time();
        $temp['validtime'] = $validtime;
        $temp['value'] = $value;
        return serialize($temp);
    }

    /**
     * 获取反序列化后的内容
     * @param $data
     * @return mixed
     */
    protected function getCacheValue($data)
    {
        return unserialize($data);
    }

    /**
     * 获取文件名称
     * @param $key
     * @return string
     */
    protected function getFileName($key)
    {
        return md5($key) . '.txt';
    }

    /**
     * 获取文件绝对路径
     * @param $filename
     * @return string
     */
    protected function getFullFilePath($filename)
    {
        return $this->cache_dir . $filename;
    }

    /**
     * 递归创建目录
     * @param $dir
     * @return bool
     */
    protected function mkDirs($dir){
        if(!is_dir($dir)){
            if(! self::mkDirs(dirname($dir))) {
                return false;
            }
            if(! @mkdir($dir,0777)){
                return false;
            }
        }
        return true;
    }

    /**
     * 获取文件目录列表,该方法返回数组
     * @return array
     */
    protected function getDir() {
        $dir = $this->cache_dir;
        $dirArray[] = NULL;
        if (false != ($handle = opendir ( $dir ))) {
            $i=0;
            while ( false !== ($file = readdir ( $handle )) ) {
                //去掉"“.”、“..”以及带“.xxx”后缀的文件
                if ($file != "." && $file != ".."&&!strpos($file,".")) {
                    $dirArray[$i]=$file;
                    $i++;
                }
            }
            //关闭句柄
            closedir ( $handle );
        }
        return $dirArray;
    }
}

 

© 著作权归作者所有

共有 人打赏支持
David
粉丝 0
博文 1
码字总数 468
作品 0
广州
技术主管
私信 提问
shooke/corephp2

CorePHP 简介: CorePHP框架是一个快速,安全,灵活的php开源框架,主要是为了简化和快速开发小型项目和开源系统二次开发而诞生。它既可以完美的支持MVC模式,又可以不受限制的支持传统编程模...

shooke
2015/01/30
0
0
php的目录结构

phpcms v9框架的目录结构分析 phpcmsv9框架的目录结构分析: 了解v9框架的目录结构,有助于帮助我们快速建立起对v9框架的一个整体认识 打开"mycms"项目,有如下文件和目录 使用协议说明文档、...

名字已被取
2016/03/30
54
0
Go! 0.5.0 发布,PHP 的 AOP 库

Go! 0.5.0 发布,此版本的代理存储在独立的文件中,允许更透明的调试;添加了一个缓存 cache warmer 命令;扩展了 or-ed 方法的 pointcut 语法: ClassName->method1|method2(*);支持只读文...

oschina
2014/05/26
1K
5
PHP的Realpath Cache

PHP的缓存有很多种,包括输出缓冲(ob系列函数),opcode缓存(APC,eAccelerator,XCache等扩展实现),这些大家已经很熟悉了,接下来介绍一下一个不太被人注意的PHP缓存机制:realpath_cache。 ...

clearchen
2012/08/15
0
0
PHP7 opcache缓存清理问题

PHP7 opcache缓存清理问题 背景 OPcache通过opcode的缓存和优化,提供更快的PHP执行过程。 业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展。 业务在更新代码后,访...

双鱼座小龙
2017/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

想问一下C++里queue要怎么遍历

如题,想知道怎么遍历<queue>对象的元素? 貌似不能遍历。要么全部pop push一遍,要么换个容器呗。 queue是先进后出的数据类型,只能不断读top()然后再pop()掉。故意把遍历操作隐藏掉了,...

shzwork
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
2
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
3
0
【转】go get命令使用socket代理

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如: 1234...

yiduwangkai
昨天
6
0
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

//第一种做法 public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList <Integer> li=new ArrayList<Integer>(); ArrayList <TreeN......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部