发布于2026-07-08 阅读(0)
扫一扫,手机访问
贵也说了,Lara vel 队列任务失败的时候,默认是不给你发邮件的。你必须手动在任务类的 failed() 方法里写通知逻辑,没有捷径可走。为啥?因为队列这个东西,完全是独立于 HTTP 请求生命周期跑的。

简单说:队列失败时,Lara vel 不会主动通知你,你必须在 failed() 方法里亲手写通知代码。
App\Exceptions\Handler)管不了队列,这是第一个坑其实也好理解:队列进程(比如 php artisan queue:work)是独立运行的,跟 HTTP 请求生命周期完全是两套体系。就算你在 Handler::report() 里写了邮件发送,任务执行时抛出的异常也根本不会走那条路。
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() 不是每次失败都触发,只在“最终失败”那一刻才执行一次——也就是任务达到最大重试次数之后。
failed()。生产环境一定要显式设置 protected $tries = 3;protected $backoff = [3, 6]; 可以避免雪崩式重试,但总耗时是各次间隔之和加上执行时间,要心里有数handle() 中手动调用 $this->fail($exception),但这样会跳过后续重试,必须慎用retryUntil() 返回一个时间点,比固定次数更灵活,适合有明确截止时间的任务最容易忽略的是:failed() 方法本身如果再抛出异常,整个失败处理就静默淹没了——既没有邮件也没有日志。务必在方法内部做最简健壮的封装,最差也要包一层 try-catch,确保至少把异常记下来。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8