thinkphp项目需自定义命令按时间筛选清理runtime/cache/和runtime/log/中旧文件,避免磁盘告急;默认不自动清理,不能直接删runtime/整目录,须用filemtime()判断修改时间,配合cron每日执行并记录日志。

ThinkPHP项目缓存文件长期堆积在 runtime/cache/ 和 runtime/log/ 下,不清理会导致磁盘空间告急、I/O变慢甚至服务中断;默认机制不会自动删除旧文件,必须手动或定时介入。
确认当前缓存与日志路径
打开项目根目录下的 config/cache.php,查看 default 驱动及对应 stores 中 file 驱动的 path 配置;若未显式设置,则缓存路径为 runtime/cache/,日志路径为 runtime/log/。多应用模式下,缓存路径可能是 runtime/appname/cache/,需用 cache_path() 函数动态获取,不能硬编码。
【不要直接删 runtime/ 整个目录】——里面含 route.php、view/ 编译模板、temp/ 配置缓存等关键文件,误删将导致 404 或 Class not found 错误。
编写安全的自定义清理命令
在 app/command/ 目录下新建 ClearOldFiles.php 文件,内容如下:
第一步:声明命名空间和继承基础命令类,确保能调用 $this->info() 输出日志;
第二步:在 handle() 方法中获取真实路径:$logPath = runtime_path('log'); 和 $cachePath = cache_path();;
第三步:调用私有方法清理日志(保留最近 7 天):$this->clearOldFiles($logPath, 7 * 86400, '/\.log$/');;
第四步:清理缓存(保留最近 24 小时):$this->clearOldFiles($cachePath, 24 * 3600, '/\.php$/');;
注意:正则 /\.php$/ 是为匹配 ThinkPHP File 驱动生成的缓存文件(如 abc123.php),但不能依赖扩展名判断有效性——缓存文件可能无后缀或带随机哈希,真正可靠的是 filemtime() 时间戳比对。
配置 Linux 定时任务(cron)
执行 crontab -e,添加一行:
0 3 * * * cd /path/to/your/project && php think clear-old-files >> /var/log/thinkphp-clear.log 2>&1
这表示每天凌晨 3 点执行自定义命令,并将输出追加到日志文件;务必替换 /path/to/your/project 为实际项目绝对路径,否则 cron 找不到 think 命令或 runtime 目录。
方法一:用 find 命令临时应急(不推荐长期用):find runtime/log/ -name "*.log" -mtime +7 -delete;
方法二:更稳妥的 find 写法,跳过当天日志文件:find runtime/log/ -name "*.log" -type f ! -newermt "$(date -d '7 days ago' +%Y-%m-%d)" -delete;
方法三:清理缓存目录时加 -depth 参数避免“目录非空”报错:find runtime/cache/ -depth -type f -mtime +1 -delete。
验证清理是否生效
执行完命令后,立刻运行 du -sh runtime/cache/ runtime/log/ 查看目录大小变化;
检查日志文件是否只剩最近 N 天的记录,例如 runtime/log/2026-07-29.log 和 2026-07-30.log 应保留,2026-07-22.log 及更早的应消失;
缓存目录里不应再出现修改时间超过 24 小时的 .php 文件,但要注意:opcache 可能缓存了已删文件的 stat 信息,此时加一句 clearstatcache(true); 在清理函数末尾可避免误判。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











