ThinkPHP6不内置定时任务成功回调机制,需在execute()中手动添加邮件、Webhook、日志或命令调用等通知逻辑,或通过crontab重定向配合Shell脚本判断结果后通知,也可借助数据库状态标记与轮询实现可靠成功确认。

ThinkPHP6 本身不提供定时任务执行成功后的自动回调通知机制,因为它的设计原则是“调度归系统,逻辑归代码”——任务由 crontab 或其他调度器触发,框架只负责执行。所以“回调通知”不是框架内置功能,而是需要你主动在任务逻辑中实现。
在 execute() 方法里加通知逻辑
这是最直接、最可控的方式。只要你的命令行任务执行完成(且返回 0),你就可以在 execute() 方法末尾插入通知代码,比如发邮件、写日志、调用 Webhook 或推送到消息队列。
- 发送邮件:用 ThinkPHP 自带的
think\facade\Mail或第三方 SDK(如 PHPMailer) - 推送 Webhook:用
curl或Http::post()向企业微信/钉钉/飞书机器人地址发 JSON 消息 - 记录到数据库或日志:调用
Log::info()或写入自定义任务日志表 - 触发后续动作:例如调用另一个命令
$this->call('another:task')(需确保非阻塞)
用 crontab 的输出重定向配合脚本做外部通知
crontab 支持标准输出和错误输出重定向,你可以把执行结果交给 Shell 脚本判断,再决定是否通知。
- 在 crontab 中这样写:
0 * * * * cd /var/www/myproject && /usr/bin/php think cron:backup > /tmp/backup.log 2>&1 && /bin/bash /path/to/notify.sh /tmp/backup.log -
notify.sh可以检查日志里是否含 “✅ 备份完成”,有则调用 curl 发送提醒 - 优点是解耦:PHP 只管干活,Shell 负责判断和通知;适合已有运维脚本体系的团队
借助失败重试机制反向实现“成功确认”
如果任务关键性高,建议用“成功标记 + 异步轮询”方式增强可靠性:
立即学习“PHP免费学习笔记(深入)”;
- 任务开始时写一条记录到数据库,状态为
running - 执行成功后更新为
success,并记录结束时间 - 另起一个轻量级定时任务(如每5分钟跑一次),扫描超过30分钟仍是
running的记录,视为超时失败,发告警 - 对刚变更为
success的记录,立刻触发通知(可结合 Redis pub/sub 或简单查库+发送)
避免常见坑
通知逻辑必须适配 CLI 环境:
- 别依赖 $_SERVER 或 session,CLI 下不存在
- 邮件配置要单独设置 SMTP 主机、端口、账号密码,不能复用 Web 端配置(除非明确做了环境区分)
- Webhook 请求需加超时(
timeout=5),防止卡住整个定时任务 - 不要在通知失败时 throw Exception 或 exit,否则 crontab 会记为失败;应记录错误并继续执行



















