ThinkPHP6需借助外部定时机制清理日志;直接使用php think clear不安全,推荐自定义CleanOldLogs命令或改用Monolog RotatingFileHandler自动轮转,辅以find脚本清理。

ThinkPHP6 本身不内置定时清理日志的脚本,但完全支持通过外部定时机制调用清理逻辑——关键在于“谁来触发”和“怎么清理”。
原生命令不能直接定时清日志
TP6 提供的 php think clear 默认会清 runtime/cache/、runtime/log/ 等目录,但它是一次性全量操作,且不区分文件新旧。直接用于定时任务有风险:可能误删当天正在写入的 think-2026-10-29.log,导致后续日志写入失败或报错。
所以不能简单写成:
0 2 * * * php /path/think clear
这种做法在生产环境不安全。
推荐方案:自定义命令 + Crontab
更稳妥的做法是自己写一个专清“过期日志”的命令,再让系统定时调用它:
- 用 php think make:command CleanOldLogs 创建命令类
- 在 execute() 方法里遍历
runtime/log/,用filemtime()判断修改时间,只删除 7 天前的 .log 文件(跳过当天及昨日文件) - 注册该命令到
config/console.php - 服务器加 Crontab:
0 2 * * * /usr/bin/php /var/www/myapp/think clean:old-logs >> /dev/null 2>&1
更省心的方案:Monolog 自动轮转
与其靠脚本定期删,不如从源头控制日志生成行为:
- 安装 Monolog:
composer require monolog/monolog - 在
config/log.php中把日志通道 type 改为'monolog' - handler 配置 RotatingFileHandler,指定
$maxFiles = 30(保留最近 30 个日志文件)和时区new \DateTimeZone('Asia/Shanghai') - 这样每天生成新文件时,最老的那个自动被删,无需额外脚本
Linux 脚本清理作为补充手段
如果暂时不想改日志驱动,也可用 shell 脚本辅助:
- 脚本中用
find runtime/log/ -name "think-*.log" -mtime +7 -delete删除 7 天前文件 - 但必须加判断:先
ls -t runtime/log/ | head -n1拿到最新文件名,确认不是当天的再执行 delete - 加入
clearstatcache(true, $file)防止 opcache 缓存文件状态导致误判 - 同样通过 crontab 每日凌晨执行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











