ThinkPHP5.1清除缓存功能的实现


ThinkPHP5.1 清除缓存

第一种方法

在基类控制器里,写上clear()方法,到时候用于调用,在也不是JSalert('清除缓存了')
当然,5.1取消了CACHE_PATH TEMP_PATH常量,所以要定义这些缓存目录,还需引入use think\facade\Env

// 我是直接按照文档,设置了2个变量来存储缓存目录,当然还可以在配置文件中进行配置,然后通过config获取
public function clear(){
    $CACHE_PATH = Env::get('runtime_path') . 'cache/';
    $TEMP_PATH = Env::get('runtime_path'). 'temp/';
    if (delete_dir_file($CACHE_PATH) && delete_dir_file($TEMP_PATH)) {
        return json(["code"=>1,"msg"=>"清除缓存成功"]);
    } else {
        return json(["code"=>0,"msg"=>"清除缓存失败"]);
    }
}

这个时候发现delete_dir_file()函数未定义,我们去公共函数里进行定义并写出来:
由于5.1 没有DS常量了,所以选用DIRECTORY_SEPARATOR来代替

common.php:

/**
 * 循环删除目录和文件
 * @param string $dir_name
 * @return bool
 */
function delete_dir_file($dir_name) {
    $result = false;
    if(is_dir($dir_name)){
        if ($handle = opendir($dir_name)) {
            while (false !== ($item = readdir($handle))) {
                if ($item != '.' && $item != '..') {
                    if (is_dir($dir_name . DIRECTORY_SEPARATOR. $item)) {
                        delete_dir_file($dir_name . DIRECTORY_SEPARATOR. $item);
                    } else {
                        unlink($dir_name . DIRECTORY_SEPARATOR. $item);
                    }
                }
            }
            closedir($handle);
            if (rmdir($dir_name)) {
                $result = true;
            }
        }
    }
    return $result;
}

第二种方法

public function delCache() {
    if (Dir::del(Env::get('runtime_path').'cache/') {
        $data = ['status' => 1, 'info' => '缓存删除成功'];
    } else {
        $data = ['status' => 0, 'info' => '缓存删除失败];
    }
    return json($data);
}

这个需要一个Dir类

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: superman <953369865@qq.com>
// +----------------------------------------------------------------------
namespace Org\Util;
use Think\Db;
final class Dir
{

    /**
     * @param string $dir_name 目录名
     * @return mixed|string
     */
    static public function dirPath($dir_name)
    {
        $dirname = str_ireplace("\\", "/", $dir_name);
        return substr($dirname, "-1") == "/" ? $dirname : $dirname . "/";
    }

    /**
     * 获得扩展名
     * @param string $file 文件名
     * @return string
     */
    static public function getExt($file)
    {
        return strtolower(substr(strrchr($file, "."), 1));
    }

    /**
     * 遍历目录内容
     * @param string $dirName 目录名
     * @param string $exts 读取的文件扩展名
     * @param int $son 是否显示子目录
     * @param array $list
     * @return array
     */
    static public function tree($dirName = null, $exts = '', $son = 0, $list = array())
    {
        if (is_null($dirName)) $dirName = '.';
        $dirPath = self::dirPath($dirName);
        static $id = 0;
        if (is_array($exts))
            $exts = implode("|", $exts);
        foreach (glob($dirPath . '*') as $v) {
            $id++;
            if (is_dir($v) || !$exts || preg_match("/\.($exts)/i", $v)) {
                $list [$id] ['type'] = filetype($v);
                $list [$id] ['filename'] = basename($v);
                $path = str_replace("\\", "/", realpath($v)) . (is_dir($v) ? '/' : '');
                $list [$id] ['path']=$path;
                $list [$id] ['spath']=ltrim(str_replace(dirname($_SERVER['SCRIPT_FILENAME']),'',$path),'/');
                $list [$id] ['filemtime'] = filemtime($v);
                $list [$id] ['fileatime'] = fileatime($v);
                $list [$id] ['size'] = is_file($v) ? filesize($v) : self::get_dir_size($v);
                $list [$id] ['iswrite'] = is_writeable($v) ? 1 : 0;
                $list [$id] ['isread'] = is_readable($v) ? 1 : 0;
            }
            if ($son) {
                if (is_dir($v)) {
                    $list = self::tree($v, $exts, $son = 1, $list);
                }
            }
        }
        return $list;
    }

    static public function get_dir_size($f)
    {
        $s = 0;
        foreach (glob($f . '/*') as $v) {
            $s += is_file($v) ? filesize($v) : self::get_dir_size($v);
        }
        return $s;
    }

    /**
     * 只显示目录树
     * @param null $dirName 目录名
     * @param int $son
     * @param int $pid 父目录ID
     * @param array $dirs 目录列表
     * @return array
     */
    static public function treeDir($dirName = null, $son = 0, $pid = 0, $dirs = array())
    {
        if (!$dirName) $dirName = '.';
        static $id = 0;
        $dirPath = self::dirPath($dirName);
        foreach (glob($dirPath . "*") as $v) {
            if (is_dir($v)) {
                $id++;
                $dirs [$id] = array("id" => $id, 'pid' => $pid, "dirname" => basename($v), "dirpath" => $v);
                if ($son) {
                    $dirs = self::treeDir($v, $son, $id, $dirs);
                }
            }
        }
        return $dirs;
    }

    /**
     * 删除目录及文件,支持多层删除目录
     * @param string $dirName 目录名
     * @return bool
     */
    static public function del($dirName)
    {
        if (is_file($dirName)) {
            unlink($dirName);
            return true;
        }
        $dirPath = self::dirPath($dirName);
        if (!is_dir($dirPath)) return true;
        foreach (glob($dirPath . "*") as $v) {
            is_dir($v) ? self::del($v) : unlink($v);
        }
        return @rmdir($dirName);
    }

    /**
     * 批量创建目录
     * @param $dirName 目录名数组
     * @param int $auth 权限
     * @return bool
     */
    static public function create($dirName, $auth = 0755)
    {
        $dirPath = self::dirPath($dirName);
        if (is_dir($dirPath))
            return true;
        $dirs = explode('/', $dirPath);
        $dir = '';
        foreach ($dirs as $v) {
            $dir .= $v . '/';
            if (is_dir($dir))
                continue;
            mkdir($dir, $auth);
        }
        return is_dir($dirPath);
    }

    /**
     * 复制目录
     * @param string $olddir 原目录
     * @param string $newdir 目标目录
     * @param bool $strip_space 去空白去注释
     * @return bool
     */
    static public function copy($olddir, $newdir, $strip_space = false)
    {
        $olddir = self::dirPath($olddir);
        $newdir = self::dirPath($newdir);
        if (!is_dir($olddir))
            error("复制失败:" . $olddir . "目录不存在");
        if (!is_dir($newdir))
            self::create($newdir);
        foreach (glob($olddir . '*') as $v) {
            $to = $newdir . basename($v);
            if (is_file($to))
                continue;
            if (is_dir($v)) {
                self::copy($v, $to, $strip_space);
            } else {
                if ($strip_space) {
                    $data = file_get_contents($v);
                    file_put_contents($to, strip_space($data));
                } else {
                    copy($v, $to);
                }
                chmod($to, "0777");
            }
        }
        return true;
    }

    /**
     * 目录下创建安全文件
     * @param $dirName 操作目录
     * @param bool $recursive 为true会递归的对子目录也创建安全文件
     */
    static public function safeFile($dirName, $recursive = false)
    {
        $file = LIB_PATH . '/index.html';
        if (!is_dir($dirName)) {
            return;
        }
        $dirPath = self::dirPath($dirName);
        /**
         * 创建安全文件
         */
        if (!is_file($dirPath . 'index.html')) {
            copy($file, $dirPath . 'index.html');
        }
        /**
         * 操作子目录
         */
        if ($recursive) {
            foreach (glob($dirPath . "*") as $d) {
                is_dir($d) and self::safeFile($d);
            }
        }
    }

}

文章作者: virus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 virus !
 上一篇
react的第一个程序 react的第一个程序
React安装Create React AppCreate React App时一个用于学习React的环境,也是用React创建新的单页应用的最佳方式 Node >= 8.1.0 npm >= 5.6 创建项目请执行: n
2020-04-10
下一篇 
上传图片 上传图片
Laravel异步上传流程一 产生异步的请求 请求得有一个相应的方法(需要返回值,返回内容:图片的路径;在此不需要进行数据表的交互) 当异步请求获取到相应之后需要存储图片的地址(但是又没必要给用户看地址,可以使用隐藏域的方式进行存储) 当用
2020-04-06
  目录