为何我的Laravel Job未进入队列,仅按普通代码执行?
搞定你的Laravel Sync队列Job问题
兄弟,先给你理清楚核心点:你用的sync驱动其实是同步执行的——也就是说你调用dispatch()的时候,Job会直接在当前请求进程里跑,不会真的后台异步执行。如果想要“立即返回响应,任务后台跑”,sync根本做不到,得换异步驱动(比如database、redis)+ queue:work才行。不过先不说这个,先解决你现在Job突然不正常的问题,毕竟你之前是正常的,改了Notification代码才出问题。
第一步:先排查配置有没有跑偏
虽然你说.env和config/queue.php已经配了,但还是快速核对下:
- 打开.env,确认
QUEUE_CONNECTION=sync,别被其他环境变量覆盖了 - 看config/queue.php里的sync配置块,默认就行,不用改啥,确保没被误修改
第二步:锁定Notification的锅
你说只改了推送Notification的代码,那大概率问题出在这:
- 先把Job里和Notification相关的代码注释掉,跑一遍原来的逻辑,如果正常了,那百分百是Notification的问题
- 单独测试Notification:直接在控制器里写一行代码调用它,比如:
看看会不会报错,比如用户不存在、$targetUser = User::find(你要推送的用户ID); $targetUser->notify(new 你的Notification类());via()方法写错了通道(比如把mail写成email)、toMail()里用了未定义的变量这些 - 检查Notification的
via()方法,是不是返回了正确的通道数组,比如return ['mail', 'database'];,别写错了
第三步:扒日志找线索
Laravel的日志藏在storage/logs/laravel.log里,打开搜和Job、Notification相关的关键词,比如Job、Notification、Error这些,里面肯定有具体的报错信息——比如SQL语法错了、类找不到、调用了不存在的方法,这些都是直接定位问题的关键。
第四步:确认Job的调用方式没搞错
你是怎么触发Job的?是不是写成了直接调用handle()方法?比如:
// 错的!这是直接同步执行handle,不是dispatch new YourJob()->handle(); // 正确的dispatch方式应该是 YourJob::dispatch(参数1, 参数2); // 或者 dispatch(new YourJob(参数1, 参数2));
虽然sync驱动下dispatch也是同步,但如果调用方式错了,也可能出问题。
最后再提下“后台执行”的误区
如果你真的想要用户发请求后立刻收到响应,任务在后台跑,那sync驱动真的满足不了。得换异步驱动,比如用database的话:
- .env里改
QUEUE_CONNECTION=database - 跑
php artisan queue:table和php artisan migrate建队列表 - 启动队列worker:
php artisan queue:work,要是怕终端关了就停,可以用supervisor守护进程,这样就不用每次手动启动了
内容的提问来源于stack exchange,提问作者Adarsh Sojitra
相关产品推荐
相关产品推荐

