ThinkPHP 6 定时任务需通过日志分离、数据库记录和Shell脚本三层手段实现可验证追踪:CLI下必须指定Log::channel('cli'),任务日志需含唯一标识;关键任务应落库cron_task_log表记录状态与耗时;Shell脚本需封装执行统计并规避路径、权限等常见失效坑。

ThinkPHP 6 的定时任务本身不内置执行统计功能,但可通过日志、状态标记和轻量记录三类手段实现可靠的任务执行追踪——关键不在“自动统计”,而在“可验证、可回溯、可归因”。
日志通道分离 + 时间戳标记
避免混用 Web 日志通道,CLI 环境下必须显式指定日志通道,否则内容可能被丢弃或写入错误位置:
- 在命令类的 execute() 方法中,统一使用
Log::channel('cli')->info('task:start', ['task' => 'sync:order', 'time' => date('Y-m-d H:i:s')]); - 为每个任务单独配置日志文件(如
runtime/log/cron/sync_order.log),便于按任务归档与 grep 统计 - 日志行必须含唯一标识(如任务名、日期、PID 或随机 trace_id),方便后续脚本提取:例如
[2026-08-06 12:30:01] sync:order success pid=12345
数据库/缓存记录执行状态
对关键任务(如每月结算、数据同步),建议在业务逻辑中主动落库一条执行记录:
- 建一张
cron_task_log表,字段至少含:task_name(varchar)、exec_time(datetime)、status(tinyint)、duration_ms(int)、remark(text) - 在 execute() 开头插入记录(status=0),结尾更新为 success/fail 并写入耗时;失败时捕获异常并更新 remark
- 避免用
Db::table()->insert()直接操作,优先通过模型或事务保障一致性
Shell 脚本层加壳统计
crontab 调用的是 shell 脚本,可在脚本中封装执行次数、成功/失败标记、运行时长等基础指标:
- 脚本开头记录开始时间:
start_ts=$(date +%s.%N) - 调用 php think 命令后,用
$?判断退出码:if [ $? -eq 0 ]; then echo "OK" >> /log/summary.log; else echo "FAIL" >> /log/summary.log; fi - 每日汇总脚本可统计:
grep -c "OK" /log/summary.log | tail -n7查最近 7 天成功次数
避免统计失效的常见坑
很多统计“看似存在”却无法用于排查,根源常在环境或设计:
- crontab 中未指定
cd /path/to/project,导致日志路径相对错误、写入失败 - PHP 路径写成
php而非绝对路径(如/usr/bin/php),cron 环境找不到解释器,任务根本没跑 - 日志文件权限不足(如 www-data 用户无权写入 log 目录),静默丢弃所有输出
- 未验证命令注册是否生效:执行
php think list | grep your:command,缺失即统计无意义
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











