Laravel使用database队列驱动时任务已处理但未执行业务逻辑
核心诱因排查(按出现概率排序)
Job类属性未正确赋值导致逻辑跳过
你在handle()中依赖的$this->event_name、$this->payload等类属性,必须通过Job构造函数接收dispatch传入的参数后手动赋值。你当前贴出的Job构造函数为空,dispatch传入的array("message" => "test")未被赋值到类属性,队列执行时这些属性全部为null,直接导致handle()开头的if($this->event_name === "example")判断不成立,整个业务逻辑块根本不会执行,方法走完后任务直接从jobs表删除,呈现「已处理但无逻辑执行」的假象。
验证方式:在handle()方法最开头加一行日志\Log::info('Job触发', ['event' => $this->event_name, 'payload' => $this->payload]),重新dispatch任务查看日志输出即可确认。环境配置不生效问题
Laravel 5.8及以上版本已废弃.env中使用的QUEUE_DRIVER键,官方改用QUEUE_CONNECTION,你的queue.php中默认配置读取的是env('QUEUE_CONNECTION', 'sync'),原QUEUE_DRIVER配置不会生效,这也是你移除onConnection('database')后任务默认跑在sync模式的原因。
另外如果之前执行过php artisan config:cache,.env的所有修改都不会被加载,需要先执行php artisan config:clear清除配置缓存后再测试。异常被静默吞掉
队列执行时如果抛出未捕获异常,默认会将任务写入failed_jobs表而非直接删除,先执行以下命令创建失败任务表:php artisan queue:failed-tablephp artisan migrate
然后带详细日志参数启动队列:php artisan queue:work database -v,所有执行过程中的错误都会直接在终端打印,可快速定位是代码抛错还是逻辑本身被跳过。
额外注意:确保启动队列的终端是在项目根目录下执行,且使用的PHP版本与XAMPP内置PHP版本一致,避免因为终端调用了系统全局PHP、缺少必要扩展导致的运行异常。队列名不匹配(低概率)
如果你的dispatch代码中加了->onQueue('xxx')指定非默认队列名,启动监听时必须同步指定队列名:php artisan queue:work database --queue=xxx,否则任务虽写入jobs表但不会被对应监听进程消费(你当前描述任务会被标记为已处理,基本可以排除该问题)。
内容的提问来源于stack exchange,提问作者Jaeger

