• 背景

    随着网站体量的不断增大,很多缓存日志造成资源你的浪费,
    为此,想着写一个计划任务,定期删除没必要的缓存数据
    想到,可以使用 Linux编辑一个计划任务
    或者,以ThinkPHP5为例,设计一个自定义指令
    定期删除一个月前的缓存文件 …

一、 Linux 指令操作

首先,以Linux为操作对象,设计定时任务进行删除文件指令

  • ①. 新建一个可执行文件
touch /usr/local/bin/clear_log

注意,赋予权限:chmod 777 clear_log

  • ②. 编辑 clear_log 文件,在其中添加类似下面的代码
#!/bin/sh
find /mnt/www/Application/Runtime/Logs  -mtime +10 -name *.* -exec rm -rf {} \;
find /tmp  -type f -mmin +120 -name *.log -exec rm -rf {} \;

解析:
find 后面紧跟的是要查找的目录,. 表示当前目录
-type f: 指定查找对象为文件
-name *.log: 指定查找对象名称以.log结尾
-mtime +10: 查找10天以前的老文件
-mmin +120: 查找120分钟(两小时)以前的老文件
-exec rm -rf {} ; :执行删除命令,这句注意,后面有个 {} ; 是必须的

  • ③. 将 clear_log 文件加入到系统计划任务
# crontab -e

然后,输入:

# 每三十分钟执行一次
*/30 * * * * /usr/local/bin/clear_log
  • ④. 保存代码后 ,再执行下面的命令,以保证计划任务的生效
# /etc/rc.d/init.d/crond restart  

[提示]:

也可,设计执行的代码逻辑(java/php等)
然后,指令调用方式:【30 2 * * * /usr/bin/curl http://xxx.xxx.x.xxx/index/order/taskToDelRuntimeLogs】
具体的访问时间间隔,自行变动即可

二、自定义指令定时删除文件

ThinkPHP5 ,参考 —— 【ThinPHP5 文档 - 自定义指令】

  • ①. PHP 删除指定目录下的文件

    在搜索本文解决方案时,发现,也可以使用代码进行文件的删除,
    比如我使用的是PHP,那么可以指定目录,进行删除其下的所有文件

核心处理方法如下:

/**
 * 删除对应目录下的所有文件
 * @param $path 传入目录
 * 举例: delServerDir("/mnt/www/Application/Runtime/Logs/");
 */
function delServerDir($path){
    //如果是目录则继续
    if(is_dir($path)){
        //扫描一个文件夹内的所有文件夹和文件并返回数组
        $p = scandir($path);
        foreach($p as $val){
            //排除目录中的.和..
            if($val !="." && $val !=".."){
                //如果是目录则递归子目录,继续操作
                if(is_dir($path.$val)){
                    //子目录中操作删除文件夹和文件
                    delServerDir($path.$val.'/');
                    //目录清空后删除空文件夹
                    @rmdir($path.$val.'/');
                }else{
                    //如果是文件直接删除
                    unlink($path.$val);
                }
            }
        }
    }
}

/**
 * PHP 删除指定的图片
 * @param $filename 目标图片路径
 * @return bool
 */
function deleteServerFile($filename)
{
    if (file_exists($filename)) { //检查图片文件是否存在
        $result = @unlink($filename);
        return true;
//        if ($result == true) {
//            echo '删除成功';
//        } else {
//            echo '无法删除';
//        }
    } else {
        return false;
    }
}

[提示]

ThinkPHP5 框架下,可以设计自定义指令,每天定时删除 最后修改时间在 1个月前的 runtime 文件.

  • 如下为我的具体处理逻辑 (仅供参考,可根据自己的业务自行优化设计)
		//测试代码如下:
	    $runtime_dir = app()->getRootPath() . 'runtime/';
        $runtime_dir=str_replace("\\","/",$runtime_dir);
        try {
            self::delServerDir($runtime_dir);
        }catch (\Exception $e){
            $opFlag = 0;
            $opMessage = '删除失败:'. $e->getMessage();
        }
		……

    /**
     * 删除对应目录下的所有文件
     * @param string $path 传入目录
     * 举例: delServerDir("/mnt/www/Application/Runtime/Logs/");
     */
    public static function delServerDir($path = ''){
        //如果是目录则继续
        if(is_dir($path)){
            $empty_dir = false;
            //扫描一个文件夹内的所有文件夹和文件并返回数组
            $p = scandir($path);
            $last_month_time = strtotime('-1 month');
            foreach($p as $val){
                //排除目录中的.和..
                if($val !="." && $val !=".."){
                    $file_path = $path.$val;
                    $empty_dir = true;
                    //如果是目录则递归子目录,继续操作
                    if(is_dir($file_path)){
                        //子目录中操作删除文件夹和文件
                        self::delServerDir($file_path.'/');
                    }else{
                        //如果修改文件时间 大于一个月
                        $finish_time = filemtime($file_path);
                        if ($finish_time < $last_month_time){
                            //如果是文件直接删除
                            self::deleteServerFile($file_path);
                        }
                    }
                }
            }
            if(!$empty_dir){
                //目录清空后删除空文件夹
                @rmdir($path);
            }
        }
    }

附录

①. 磁盘使用状况

  • 可通过 df -h 查看磁盘使用情况
  • 通过 du -h --max-depth=1 查看对应目录下文件的资源占用情况

通过分析以上数据,判断哪个目录或者缓存、log 文件占用资源大,进行后面的删除操作

②. 参考文章

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:1 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐