Lumen 8调用队列报Trying to access array offset on value of type null如何解决
错误产生原因
报错位置QueueManager.php:156的代码逻辑为读取队列连接配置中的retry_after参数,出现该错误是因为系统无法读取到有效队列连接配置,导致配置变量为null,PHP 8.0对null值数组偏移访问的错误级别从低版本的警告升级为错误,因此直接抛出异常。
配置缺失的常见诱因包括:
- 未开启Lumen的队列服务提供者
- .env文件未配置
QUEUE_CONNECTION参数 - 项目缺失队列配置文件
config/queue.php - Job基类未实现队列所需的基础接口与trait
排查步骤
- 检查
bootstrap/app.php中是否已经注册队列服务提供者,Lumen默认会注释掉该服务注册代码 - 检查
.env文件中是否存在QUEUE_CONNECTION配置项 - 检查项目
config目录下是否存在queue.php配置文件 - 检查
App\Jobs\Job基类是否包含队列所需的trait与接口实现
解决方法
- 开启队列服务提供者
编辑bootstrap/app.php,找到队列服务注册行,取消注释:
// 取消下面这行的注释 $app->register(Illuminate\Queue\QueueServiceProvider::class);
- 配置默认队列连接
在项目根目录.env文件中添加队列连接配置,测试场景可优先使用sync同步驱动,无需额外启动队列进程:
QUEUE_CONNECTION=sync
若使用database、redis等异步驱动,需同步配置对应驱动的连接信息、创建队列所需数据表/redis连接。
3. 补充队列配置文件
如果config目录下不存在queue.php,可创建该文件并写入Lumen 8默认队列配置:
<?php return [ 'default' => env('QUEUE_CONNECTION', 'sync'), 'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, ], 'redis' => [ 'driver' => 'redis', 'connection' => env('QUEUE_REDIS_CONNECTION', 'default'), 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ], ], 'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), 'database' => env('DB_CONNECTION', 'mysql'), 'table' => 'failed_jobs', ], ];
- 修正Job基类
确保App\Jobs\Job基类的代码如下:
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; abstract class Job implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; }
完成以上配置后重新测试任务调度即可。
内容的提问来源于stack exchange,提问作者Mohammad Zarifiyan
相关产品推荐
相关产品推荐

