如何排查Laravel SendSMSJob队列任务执行失败的原因?
Laravel队列任务失败调试方案
问题背景
SendSMSJob队列任务构造函数可正常写入system_logs日志,但handle()方法执行失败,catch代码块与failed()方法均未写入数据库日志,队列监听显示任务执行失败。
调试步骤
1. 修复异常捕获范围
当前代码仅捕获\SpecificException,但Guzzle请求抛出的是RequestException等其他异常类型,导致异常未被捕获直接触发任务失败。修改handle()方法的捕获逻辑:
public function handle() { try{ $client = new Client(); $client->request('POST','https://api.kavenegar.com/6D/vrfy/lookup.json',[ 'form_params' => [ 'receptor' => $this->mobile, 'token' => $this->code, 'template' => $this->temp, 'token2' => $this->token2, 'token3' => $this->token3 ] ]); } catch (\Exception $e) { // 改为捕获所有异常 DB::table('system_logs')->insert([ 'message' => 'Handle异常: ' . get_class($e) . ' - ' . $e->getMessage(), 'stack_trace' => $e->getTraceAsString() // 若system_logs无此字段,可临时合并到message中 ]); } }
2. 绕过数据库事务写入失败日志
队列任务执行时可能处于数据库事务中,failed()方法的插入操作会随事务回滚丢失。改用Laravel日志系统写入文件:
public function failed(\Exception $e) { \Illuminate\Support\Facades\Log::error('SendSMSJob失败详情', [ 'message' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); }
之后查看storage/logs/laravel.log即可获取失败日志。
3. 直接查看Laravel系统日志
无需修改代码,直接查看storage/logs/laravel.log,Laravel会自动记录队列任务抛出的所有异常详情,包括未被捕获的异常信息。
4. 手动执行任务代码
使用tinker在控制台直接调用任务的handle()方法,实时查看报错:
php artisan tinker $job = new App\Jobs\SendSMSJob('测试手机号', '123456', '测试模板'); $job->handle();
此方式可快速定位请求本身的问题(如API地址错误、参数无效)。
5. 验证Guzzle请求合法性
检查Kavenegar API地址格式是否正确:官方API地址应为https://api.kavenegar.com/v1/{你的API密钥}/verify/lookup.json,当前代码中的6D可能是不完整的密钥或路径错误,这会直接导致请求失败。
6. 开启队列详细输出
执行队列监听时添加--verbose参数,查看更详细的执行日志:
php artisan queue:listen --verbose
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

