必须建立主动告警机制:捕获失败信号→记录失败标识→触发外部通知;通过返回非0状态码、写入标记文件或Redis、封装带告警的shell脚本、supervisord监听、日志关键词扫描及Redis阈值告警实现。

ThinkPHP6 定时任务执行失败时,不能只依赖日志被动排查——必须建立主动告警机制。核心思路是:捕获失败信号 → 记录可识别的失败标识 → 触发外部通知。下面分三步说清楚怎么做。
明确失败判定方式
TP6 本身不内置失败告警,需手动介入判断点。常见可靠判定方式有:
- 命令执行后返回非0状态码(如exit(1)或抛出未捕获异常),这是 crontab 原生识别失败的唯一依据
- 在execute()方法末尾加逻辑:若关键步骤失败(如数据库写入失败、HTTP 请求超时),显式return 1(别用die()或exit())
- 写入失败标记文件,例如touch runtime/logs/mytask.failed,配合定时扫描
- 记录到独立失败表或 Redis key(如setex tp6:failed:mytask 300 "2026-10-29 14:05"),便于聚合统计
配置 crontab 自动触发告警
不是让 crontab 直接跑任务,而是封装一层“带兜底通知”的调用脚本:
- 新建/var/www/tp6/bin/alert-mytask.sh,内容如下:
#!/bin/bash
/usr/local/bin/php /var/www/tp6/think mytask >> /var/www/tp6/storage/logs/mytask.log 2>&1
if [ $? -ne 0 ]; then
curl -X POST "https://your-webhook.com/alert" \
-H "Content-Type: application/json" \
-d '{"title":"TP6定时任务失败","task":"mytask","time":"'"$(date '+%Y-%m-%d %H:%M')"'"}'
fi
- 赋予执行权限:chmod +x /var/www/tp6/bin/alert-mytask.sh
- crontab 条目改为:* * * * * /var/www/tp6/bin/alert-mytask.sh
- 注意:Webhook 地址可替换为钉钉/企业微信机器人、邮件脚本(如mail -s "..." admin@example.com)或自建告警服务
增强型失败监控(推荐生产环境)
仅靠 crontab 每分钟检查一次不够及时,建议叠加守护层:
- 用supervisord管理php think schedule:run进程,并配置eventlistener监听PROCESS_STATE_EXITED事件,一旦退出就发告警
- 在命令类中注册 SIGTERM 处理器,确保进程被 kill 时也能写入失败日志并触发通知
- 定期(如每5分钟)用 shell 脚本扫描storage/logs/*.log,匹配关键词"Exception"、"SQLSTATE"、"Connection refused",命中即告警
- 把失败次数存入 Redis,设置过期时间,当INCR tp6:failcount:mytask超过阈值(如5次/小时),自动触发高级告警(电话+短信)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











