需建立定时任务执行监控机制,包括:一、日志记录执行状态与耗时;二、数据库持久化追踪;三、Cron输出重定向至日志文件;四、HTTP健康检查端点供外部监控;五、Supervisor管理守护进程生命周期。

如果您已配置ThinkPHP定时任务但无法确认其是否成功执行、何时失败或执行耗时过长,则需要建立有效的执行监控机制。以下是实现定时任务执行监控的多种方法:
一、通过日志文件记录执行状态与耗时
利用ThinkPHP内置的日志系统,在每个定时任务的execute方法中主动写入结构化日志,包含开始时间、结束时间、执行结果及异常堆栈,便于后续排查和统计分析。
1、在命令类的execute方法开头调用Log::info()记录任务启动,并保存起始时间戳。
2、在任务逻辑执行完毕后,计算执行耗时并再次调用Log::info()或Log::error()记录成功或失败状态。
立即学习“PHP免费学习笔记(深入)”;
3、若发生异常,使用try...catch捕获并在Log::error()中写入完整$e->getTraceAsString()。
4、确保runtime/log/目录具有写权限,且log.level配置为info或更低级别。
二、将执行结果写入数据库表进行持久化追踪
创建专用监控表(如scheduled_task_log),每次任务运行均插入一条记录,字段包括任务名称、执行时间、状态、耗时、输出摘要及错误信息,支持按时间范围、状态筛选查询。
1、在项目数据库中执行SQL创建表:CREATE TABLE scheduled_task_log (id INT AUTO_INCREMENT PRIMARY KEY, task_name VARCHAR(100), executed_at DATETIME, status ENUM('success','failed'), duration_ms INT, output TEXT, error TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)。
2、在命令类execute方法末尾,使用Db门面或模型实例向该表插入一行记录。
3、在catch块中,将$e->getMessage()和$e->getLine()存入error字段。
4、定期清理历史记录,例如保留最近90天数据,避免表体积膨胀。
三、配置Cron标准输出与错误重定向至独立日志文件
Linux crontab本身支持将命令的标准输出(stdout)和标准错误(stderr)分别重定向到指定文件,无需修改PHP代码即可捕获框架启动失败、路径错误、权限拒绝等底层问题。
1、编辑用户crontab:执行crontab -e。
2、将原规则* * * * * /usr/bin/php /path/to/project/think sync:data改为:* * * * * /usr/bin/php /path/to/project/think sync:data >> /path/to/project/runtime/log/sync_data_cron.log 2>&1。
3、确认目标日志路径所在目录存在且web服务器与cron运行用户均有写入权限。
4、使用tail -f实时观察该日志文件,验证任务是否被系统级触发。
四、集成HTTP健康检查端点配合外部监控服务
在应用中新增一个仅限内网访问的控制器方法,返回最近N条任务执行记录的JSON摘要(如最近3次sync:data的状态与时间),供Zabbix、Prometheus或自建巡检脚本轮询调用。
1、新建控制器app/controller/Monitor.php,定义taskStatus方法。
2、该方法从数据库表scheduled_task_log中查询指定任务名的最新3条记录,并以['status'=>'success','last_executed'=>'2026-04-24 02:00:00','duration_ms'=>1245]格式返回。
3、在Nginx/Apache配置中限制该路由仅允许127.0.0.1或监控服务器IP访问。
4、配置外部监控工具每5分钟请求该接口,当连续两次返回空数组或HTTP非200状态码时触发告警。
五、使用Supervisor进程管理器监控CLI任务生命周期
当定时任务需以守护进程方式长期运行(如基于Workerman的秒级调度),Supervisor可接管其启停、自动重启与日志收集,弥补crontab仅支持分钟级调度的不足。
1、安装Supervisor:sudo apt-get install supervisor(Debian/Ubuntu)。
2、创建配置文件/etc/supervisor/conf.d/think-schedule.conf,内容包含command、autostart、autorestart及stdout_logfile等关键项。
3、执行sudo supervisorctl reread & sudo supervisorctl update加载新配置。
4、运行sudo supervisorctl status查看进程状态,sudo supervisorctl tail -f think-schedule实时跟踪输出。



















