Laravel 9 默认不支持 RabbitMQ,必须使用第三方驱动;babenkoivan/queue-rabbitmq更轻量、配置直白且无需额外扩展,适合不用Horizon的场景;vladimir-yuldashev/laravel-queue-rabbitmq对Horizon支持更好但依赖复杂,易因PHP版本或扩展缺失报错。

直接上结论:Laravel 9 默认不支持 RabbitMQ,必须用第三方驱动;babenkoivan/queue-rabbitmq 和 vladimir-yuldashev/laravel-queue-rabbitmq 都能用,但前者更轻量、配置更直白,后者对 Horizon 支持更好——选哪个取决于你是否用 Horizon。
确认 Laravel 9 兼容性与包选择
babenkoivan/queue-rabbitmq 已明确支持 Laravel 9(v12+),且不强制依赖 Enqueue 库;vladimir-yuldashev/laravel-queue-rabbitmq v11+ 也兼容,但它默认引入 enqueue/amqp-lib,容易因 PHP 版本或扩展缺失报错(比如 amqp 扩展未启用时 silently fallback 失败)。
- 如果你只跑队列任务、不用 Horizon,优先选
babenkoivan/queue-rabbitmq - 如果你已用 Horizon 或需要 Exchange 级别精细控制(如自定义
exchange_type),选vladimir-yuldashev/laravel-queue-rabbitmq - Laravel 9.19+ 用户注意:
vladimir-yuldashev包在 v11.4+ 才修复了 PHP 8.1 的 strict types 报错
使用 babenkoivan/queue-rabbitmq 的最小可行配置
它不改 Laravel 原生队列结构,所有配置集中在 config/queue.php 和 .env,无需注册服务提供者(Laravel 5.5+ 自动发现)。
- 安装:
composer require babenkoivan/queue-rabbitmq - 发布配置:
php artisan vendor:publish --provider="BabenkoIvan\QueueRabbitMQ\QueueRabbitMQServiceProvider"(生成config/rabbitmq.php) - 在
.env中设置:RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 RABBITMQ_VHOST=/ RABBITMQ_LOGIN=guest RABBITMQ_PASSWORD=guest QUEUE_CONNECTION=rabbitmq
- 在
config/queue.php的'connections'数组里加:'rabbitmq' => [ 'driver' => 'rabbitmq', 'host' => env('RABBITMQ_HOST', 'localhost'), 'port' => env('RABBITMQ_PORT', 5672), 'vhost' => env('RABBITMQ_VHOST', '/'), 'login' => env('RABBITMQ_LOGIN', 'guest'), 'password' => env('RABBITMQ_PASSWORD', 'guest'), 'queue' => env('RABBITMQ_QUEUE', 'default'), ],
vladimir-yuldashev/laravel-queue-rabbitmq 的关键差异点
这个包把 RabbitMQ 当作独立驱动,配置项更多,但也更容易踩坑。
- 它要求显式指定
'factory_class',常见错误是没装对应 transport 库:enqueue/amqp-lib(推荐)或enqueue/amqp-bunny;漏装会直接报Class not found -
hosts是数组格式,哪怕单节点也要写成[['host' => ...]],否则连接失败无提示 - 若要用 Horizon,必须设
RABBITMQ_WORKER=horizon且确保config/rabbitmq.php中'worker'值为'horizon',否则 Horizon 进程起不来 - Exchange 和 Queue 的
durable默认为true,但若 RabbitMQ 服务端没开持久化策略,首次声明会拒绝(ACCESS_REFUSED)
测试连接与常见失败信号
运行 php artisan queue:work rabbitmq --once 是最直接的验证方式。失败时重点看三处:
- 日志里出现
AMQPConnectionException→ 检查RABBITMQ_HOST是否可连、端口是否通(telnet localhost 5672)、vhost是否存在(Web UI 的Admin → Virtual Hosts) - 报
ACCESS_REFUSED - Login failed→ 用户密码错,或该用户没被授权访问vhost(RabbitMQ 里需手动Set permission) - 进程启动但不消费消息 → 检查
QUEUE_CONNECTION是否真生效(php artisan tinker里敲config('queue.default')确认)
真正麻烦的是 RabbitMQ 服务端配置和权限,不是 Laravel 代码——绝大多数问题出在 vhost 权限、用户权限、SSL 开关不一致这些地方,而不是 PHP 包本身。



















