php-amqplib是PHP接入RabbitMQ最实际、最可控的起点,纯Composer安装(composer require php-amqplib/php-amqplib),用AMQPStreamConnection连接,支持直连模式发消息,队列可自动创建,无需扩展或Erlang,适合开发调试和中小项目。

php-amqplib 是 PHP 接入 RabbitMQ 最实际、最可控的起点,不是“学 RabbitMQ”,而是“用 PHP 控制 RabbitMQ 的行为”。别被概念绕晕——先跑通一条消息,再抠细节。
用 php-amqplib 发第一条消息,5 分钟搞定
不装扩展、不配 amqp.so、不碰 Erlang,纯 Composer 方式启动最快。适合开发调试和中小项目。
-
composer require php-amqplib/php-amqplib—— 只这一行,就拿到完整 AMQP 实现 - 连接代码里用
AMQPStreamConnection,不是AMQPConnection(后者是旧版 C 扩展接口,已淘汰) - 发消息直接
$channel->basic_publish($message, '', 'my_queue'),第二个参数为空字符串表示直连模式,跳过交换机声明也能工作 - 队列会自动创建(只要
queue_declare第三个参数设为true),不用提前进管理界面点建
AMQPConnection 和 AMQPStreamConnection 别混用
看到网上示例用 new AMQPConnection()?那是 PHP 的 amqp C 扩展接口,和 php-amqplib 完全无关。两者不能共存,强行混用会报 Class 'AMQPConnection' not found 或连接后无响应。
-
amqp扩展:需编译安装、匹配 PHP 版本架构(TS/NTS/x64)、Windows 下尤其麻烦;启用后只能用AMQPConnection系列类 -
php-amqplib:纯 PHP 实现,跨平台,Composer 管理,推荐新手和容器化部署使用;必须用AMQPStreamConnection - 检查当前环境是否误启用了 C 扩展:运行
php -m | grep amqp,有输出就去php.ini注释掉extension=amqp
连不上?先盯住这三件事
90% 的 “Connection refused” 或超时,和代码无关,是环境卡点。
- RabbitMQ 服务没起来:Windows 用
services.msc查 “RabbitMQ” 是否“正在运行”;Linux 用systemctl status rabbitmq-server - 端口被占或防火墙拦了:默认 5672 是 AMQP 端口,不是 15672(那是管理界面)。用
netstat -ano | findstr :5672(Win)或ss -tuln | grep 5672(Linux)确认监听状态 - host 写成
localhost却连失败:Docker 或 WSL 场景下,改用127.0.0.1;localhost在某些系统会走 IPv6 回环,而 RabbitMQ 默认只监听 IPv4
消息发出去就丢?默认不持久,这是常态
刚跑通时发现消费者收不到消息,或者服务重启后队列空了——不是 bug,是默认配置就是“临时”的。
立即学习“PHP免费学习笔记(深入)”;
- 队列要持久化:
$channel->queue_declare('task', false, true, false, false),第三个参数true表示passive=false, durable=true - 消息要标记持久:
new AMQPMessage($body, ['delivery_mode' => 2]),delivery_mode=2才写磁盘 - 交换机也要持久(如果自定义):
$channel->exchange_declare('logs', 'fanout', false, true, false),第四个参数true - 注意:仅设队列持久但消息不设
delivery_mode=2,消息仍可能丢失
ack 和 nack 的时机。别一上来就堆配置。



















