thinkphp 6 定时任务通知需嵌入执行流程并确保 cli 环境稳定触发:1. 显式使用 log::channel('cli') 记录结构化日志;2. 按条件触发外部通知(如失败必发、成功可选);3. 封装 notifier 服务统一管理多渠道;4. 利用 cron stdout/stderr 直接输出并对接 webhook。

ThinkPHP 6 定时任务执行结果通知,核心不是“事后补发”,而是把通知逻辑嵌入到命令执行流程中,并确保在 CLI 环境下稳定触发——漏掉日志通道、异常捕获或通知条件判断,就容易出现“任务跑完了但没人知道成功还是失败”。
执行完成时主动写入结构化日志
CLI 环境默认不走 Web 日志通道,必须显式指定 channel。推荐在 execute() 结尾统一记录结果:
- 用
Log::channel('cli')->info('backup:data success', ['task' => 'backup', 'time' => date('Y-m-d H:i:s')]); - 失败时记录错误堆栈:
Log::channel('cli')->error('backup:data failed', ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); - 日志文件自动归档到
runtime/log/cli/目录,避免和 Web 日志混用
按需触发外部通知渠道
不要在每次执行都发通知,应设置明确的触发条件,例如:
- 仅当任务实际产生变更时通知(如备份生成了新文件、同步更新了 10 条订单)
- 失败时必通知,成功时可选通知(通过
--notify选项控制) - 示例代码:
if ($this->hasOption('notify') && $this->option('notify')) {<br> sendWechatAlert("✅ {$this->getName()} 执行完成");<br>}
集成轻量级通知工具类
避免在命令里硬编码 HTTP 请求,建议封装一个复用的通知服务:
- 新建
app/service/Notifier.php,支持微信模板消息、邮件、钉钉机器人 - 关键字段预设:标题固定为
[TP6-CRON],内容含命令名、执行时间、耗时、状态图标(✅/❌) - 调用时传入上下文:
(new Notifier())->send('backup:data', 'success', $duration); - 失败通知加紧急标识:
send('backup:data', 'failed', $duration, ['urgent' => true]);
让 Cron 日志本身成为通知源
Linux cron 的 stdout/stderr 是最直接的通知出口,合理利用能省去额外开发:
- 在 shell 脚本末尾加判断:
if [ $? -eq 0 ]; then echo "【成功】$(date): backup:data"; else echo "【失败】$(date): backup:data"; fi - 将输出重定向到企业微信/钉钉 Webhook 的 curl 命令(注意 URL 需 base64 编码或加 token 鉴权)
- 配合 logrotate 每日切分,保留最近 7 天 cron 日志供人工巡查
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











