简介
RabbitMQ 是消息中间件,它主要负责接收、存储和转发(发送)消息。
默认端口为 5672。
消息指的是二进制的数据。
你可以把 RabbitMQ 看作是一个邮局,它包含信箱、邮递员。
我们以 PHP 语言为例,来讲解如何使用 RabbitMQ。
准备工作
环境要求
- PHP 的版本 >= 5.6
- PHP 的 bcmath 扩展(Windows 内置支持,Linux 需手动安装)
- PHP 的 sockets 扩展(Windows 直接开启,Linux 需手动安装)
安装 php-amqplib
使用 PHP 语言作为客户端来操作 RabbitMQ,需要先在我们的应用(application)中安装 php-amqplib API。
# 推荐使用 composer 来安装
composer require php-amqplib/php-amqplib
或
composer require php-amqplib/php-amqplib:2.10.0
最简单的示例 Hello World
我们来实现一个最简单的消息发送和接收的例子。
首先,在应用(application) 目录中,创建 send.php 文件,作为消息的 Producer。
<?php
// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 声明队列(queue)
// queue_declare() 方法是幂等的,即只有当指定的 queue 不存在时才会创建
$channel->queue_declare('hello', false, false, false, false);
// 创建消息
$msg = new AMQPMessage('Hello World!');
// 将消息发送到指定的队列
$channel->basic_publish($msg, '', 'hello');
// 消息发送成功后,输出提示信息
echo " [x] Sent 'Hello World!'\n";
// 最后,关闭 channel 和 connection
$channel->close();
$connection->close();
这里,我们以 PHP CLI 的方式,发送消息。
php send.php
其次,创建 receive.php 文件,作为消息的 Consumer。
<?php
// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 声明要监听的队列(queue)
$channel->queue_declare('hello', false, false, false, false);
// 提示信息
echo " [*] Waiting for messages. To exit press CTRL+C\n";
// 回调函数
$callback = function ($msg) {
// todo 处理消息的业务逻辑
echo ' [x] Received ', $msg->body, "\n";
};
// 启动消费者
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while ($channel->is_consuming()) { // 如果正在进行回调处理
$channel->wait(); // 等待
}
// 最后,关闭 channel 和 connection
$channel->close();
$connection->close();
运行 Consumer
php receive.php
说明: Producer 发送完一条消息后就会关闭退出,而 Consumer 可以一直运行,以便监听 RabbitMQ 的 Queue 中的消息,并随时进行处理。
查看消息列表
想要查看 RabbitMQ 的队列中,有多少条消息,可以使用下面的方式。
# Linux 中,已授权的用户
sudo rabbitmqctl list_queues
# Windows 中,D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.17\sbin 目录下
rabbitmqctl list_queues
输出结果如下:
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
hello 2
当然,也可以使用 RabbitMQ 的可视化 Web 管理界面。
http://127.0.0.1:15672/#/queues
参考文献
[1] https://www.rabbitmq.com/tutorials/tutorial-one-php.html