Laravel队列稳定运行的关键是配置闭环:QUEUE_CONNECTION必须严格匹配config/queue.php中connections的键名(如redis或database),而非数据库名;需完成对应驱动的依赖安装、表迁移(database)或连接配置(redis),并启动worker进程验证入队与执行。

要让 Laravel 队列任务稳定运行,关键不是“加功能”,而是把配置闭环做严实——驱动、连接、进程、验证四个环节缺一不可。很多看似随机失败的问题,其实都卡在第一步:QUEUE_CONNECTION 值写错了。
确认队列驱动和连接名完全匹配
`.env` 中的 QUEUE_CONNECTION 必须是 config/queue.php 里 connections 数组的键名,不是数据库名,也不是包名:
- ✅ 正确:
QUEUE_CONNECTION=redis或QUEUE_CONNECTION=database - ❌ 错误:
QUEUE_CONNECTION=my_app_db(这是 MySQL 数据库名,Laravel 不认识) - 检查
config/queue.php是否存在对应配置,比如'redis' => [ 'driver' => 'redis', ... ] - 若用 Redis,确保已安装
predis/predis:^1.0,且REDIS_HOST、REDIS_PORT等与config/database.php中redis.default一致
按驱动补全基础依赖和结构
不同驱动有不同前提条件,漏掉任一环都会静默失败:
-
database 驱动:必须运行迁移生成
jobs和failed_jobs表:php artisan queue:table && php artisan migrate -
RabbitMQ 驱动:需安装
vladimir-yuldashev/laravel-queue-rabbitmq,发布配置后检查.env中RABBITMQ_HOST、RABBITMQ_VHOST是否可连通 -
Redis 驱动:建议启用
retry_after(如 90 秒),避免长任务被重复执行;block_for可设为null提升拉取效率
启动并守护队列进程
仅配置好不等于任务会自动跑——必须有 worker 在后台持续监听:
- 本地调试可用:
php artisan queue:work --verbose --tries=3 - 生产环境推荐用
supervisor守护:queue:work进程崩溃后自动重启,避免任务堆积 - 不要长期用
queue:listen,它已废弃,性能差且无重试保障 - 多队列场景下,用
--queue=high,default显式指定优先级顺序
分发后立即验证是否真正入队
别只看代码调了 dispatch(),要验证实际效果:
- 查数据库:
SELECT * FROM jobs ORDER BY id DESC LIMIT 5;(database 驱动) - 查 Redis:
redis-cli LLEN queues:default(redis 驱动) - 加日志:在任务
handle()开头写Log::info('task started'),再看日志是否有输出 - 临时切回
sync驱动测试逻辑是否正常:QUEUE_CONNECTION=sync php artisan tinker,排除业务代码问题


















