QUEUE_CONNECTION配置与Redis实际连接不一致会导致任务静默积压;需同步检查.env、config/database.php、config/queue.php三处配置,确保驱动名、主机、端口、密码一致,并用redis-cli验证连通性,运行queue:work时必须显式指定驱动名。

QUEUE_CONNECTION 和 Redis 实际连接不一致,任务就静默积压
任务 dispatch 后没反应,大概率不是代码写错了,而是 QUEUE_CONNECTION=redis 这个配置和真实 Redis 连接对不上。比如 .env 里写了 QUEUE_CONNECTION=redis,但 config/database.php 中 redis.default.host 指向了错的 IP,或者 REDIS_PASSWORD 没配对——结果 queue:work 进程根本连不上 Redis,任务全卡在内存里,日志也不报错。
必须三处联动检查:
-
.env中的QUEUE_CONNECTION、REDIS_HOST、REDIS_PORT、REDIS_PASSWORD全部有效 -
config/database.php里redis.default的键名(如'default')要和config/queue.php中redis.connection的值完全一致 -
config/queue.php的redis驱动块里不能漏掉'connection' => 'default'
用 redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD ping 手动验证连通性,别只信配置文件。
php artisan queue:work redis 必须显式指定驱动名
运行监听命令时,queue:work 后面跟的驱动名必须和 QUEUE_CONNECTION 值严格一致。例如 QUEUE_CONNECTION=redis,就必须用 php artisan queue:work redis,而不是 php artisan queue:work(默认 fallback 到 sync)或 php artisan queue:work database(连错后端,读不到 Redis 里的任务)。
开发调试时加 --verbose:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
php artisan queue:work redis --verbose能看到Processing或Failed日志,确认是否真在消费 - 如果只输出
Starting process...就停住,大概率是 Redis 连接失败或队列为空 -
queue:listen已被 Laravel 弃用,它每次启新进程、无内存回收,跑久必崩,别用
任务类没实现 ShouldQueue,dispatch() 就等于白写
哪怕写了 SendEmail::dispatch($user),如果类没声明 implements ShouldQueue,Laravel 就当它是普通 PHP 对象同步执行,根本不会进 Redis 队列。
正确写法要点:
- 类声明必须含
implements ShouldQueue,光写use Queueable不行 - 构造函数里别传 Eloquent 模型实例,而应传 ID(如
$this->userId = $user->id),在handle()里查库 - 四个 trait 缺一不可:
Dispatchable、InteractsWithQueue、Queueable、SerializesModels;漏掉SerializesModels会导致模型序列化失败,任务卡住 - 检查
storage/logs/laravel.log,搜Serialization of 'Closure'或unserialize(,这是典型序列化陷阱
生产环境必须用 Supervisor 管理 worker 进程
终端关掉,queue:work 就停,这在生产环境不可接受。必须用 Supervisor 管理,且 command 行要明确指定驱动:
command=php /var/www/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600-
numprocs=4控制并发数,不是靠代码开线程,而是起多个独立 PHP 进程抢任务 -
autorestart=true和startsecs=5确保崩溃后自动拉起 - 若用 Horizon,启动的是
php artisan horizon,它内部自动调用queue:work redis,不用额外起 worker
Redis 驱动下高并发稳定,database 驱动在高负载时容易因表锁争用导致延迟或失败,别混用。










