Laravel怎么处理队列任务失败通知_Laravel邮件或消息提醒【介绍】
作者:WeekendLife
时间:2026-07-08
浏览:0
贵也说了,Lara vel 队列任务失败的时候,默认是不给你发邮件的。你必须手动在任务类的 failed() 方法里写通知逻辑,没有捷径可走。为啥?因为队列这个东西,完全是独立于 HTTP 请求生命周期跑的。 简单说:队列失败时,Lara vel 不会主动通知你,你必须在 failed() 方法里亲
贵也说了,Lara vel 队列任务失败的时候,默认是不给你发邮件的。你必须手动在任务类的 failed() 方法里写通知逻辑,没有捷径可走。为啥?因为队列这个东西,完全是独立于 HTTP 请求生命周期跑的。

简单说:队列失败时,Lara vel 不会主动通知你,你必须在 failed() 方法里亲手写通知代码。
全局异常处理器(App\Exceptions\Handler)管不了队列,这是第一个坑
其实也好理解:队列进程(比如 php artisan queue:work)是独立运行的,跟 HTTP 请求生命周期完全是两套体系。就算你在 Handler::report() 里写了邮件发送,任务执行时抛出的异常也根本不会走那条路。
- 队列任务一旦失败,Lara vel 直接进自己的一套失败处理流程,跳过所有请求级别的异常通道
- 在
handle()里写try-catch也没用——如果你捕获了异常而不重新抛出,任务就会“假装成功”,甚至不会触发失败流程 - 真正可靠的入口只有一个:任务类自身的
failed(Throwable $exception)方法
在 failed() 里发告警邮件,得讲究技巧,不是扔个 Mail::send() 就完事了
这事儿要兼顾可读性、可维护性,还要防着失败兜底。需要注意以下几点:
- 先确认你已经跑过
php artisan queue:failed-table && php artisan migrate,否则连失败记录都存不住 - 千万别在
failed()里直接调用request()、session()或任何 HTTP 上下文对象——它们根本不存在 - 推荐的做法是按异常类型分路径处理。比如网络超时就发给运维,数据校验失败就发给开发:
if ($exception instanceof \GuzzleHttp\Exception\ConnectException) { Mail::to('ops@example.com')->send(new PaymentConnectionFailedMail($exception)); } - 记得加日志:
\Log::error()至少记下异常信息和堆栈跟踪,方便排查问题
重试次数和失败时机,直接决定 failed() 会不会被调用
注意了:failed() 不是每次失败都触发,只在“最终失败”那一刻才执行一次——也就是任务达到最大重试次数之后。
- 默认只重试 1 次,意味着第一次失败就直接进
failed()。生产环境一定要显式设置protected $tries = 3; - 设置
protected $backoff = [3, 6];可以避免雪崩式重试,但总耗时是各次间隔之和加上执行时间,要心里有数 - 如果你想在首次失败时就告警(比如关键支付任务),可以在
handle()中手动调用$this->fail($exception),但这样会跳过后续重试,必须慎用 retryUntil()返回一个时间点,比固定次数更灵活,适合有明确截止时间的任务
最容易忽略的是:failed() 方法本身如果再抛出异常,整个失败处理就静默淹没了——既没有邮件也没有日志。务必在方法内部做最简健壮的封装,最差也要包一层 try-catch,确保至少把异常记下来。
作者最新文章
打印机暂停打印的解决方法及恢复正常打印步骤
2026-09-22 14:32
华强北手机全线涨价:涨幅400-1500元,存储成本推高售价
2026-09-08 19:22
PDF转XML操作步骤与在线工具使用指南
2026-09-03 10:06
如何把多个PPT转成PDF?批量转换PDF的方法有哪些?
2026-09-02 19:32
CorelDRAW 2021图片虚化与边缘处理教程
2026-09-02 15:44
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































