本文适用于不熟悉队列和RabbitMQ的用户。那些已经知道如何使用RabbitMQ并只想探索MonsterMQ提供的可能性的人,我建议访问github.com上的项目页面,其中的描述详细描述了如何使用MonsterMQ,而没有描述使用RabbitMQ的基础知识。本文的其余部分将介绍RabbitMQ与MonsterMQ一起工作的基础知识。RabbitMQ是消息代理。它接收,存储并将消息转发给其客户。客户端的消息发送者和接收者可以服务于用PHP编写的应用程序。客户端和RabbitMQ之间的通信根据称为AMQP(高级消息队列协议)的某些规则进行。例如,浏览器和本文所在的Web服务器之间的通信也遵循某些规则,它们称为HTTP(超文本传输协议)-超文本传输协议。 HTTP和AMQP都是客户端-服务器协议,也就是说,它们暗示客户端和服务器的存在。 RabbitMQ是AMQP服务器,MonsterMQ是一个库,可让您使用PHP快速编写AMQP客户端,该客户端将与AMQP服务器进行通信。AMQP和RabbitMQ使用以下术语:生产-发送消息的方式,生产者(供应商)-发送消息的人。
消费-表示接收消息。消费者-接收消息的人。
队列就是队列。在到达消费者之前和供应商发送消息之后,该消息存储在RabbitMQ内部的队列中。队列是存储消息的缓冲区。许多提供程序可以在一个队列中发送消息,许多使用者可以从一个队列中读取消息。
请注意,提供者,消费者和经纪人不必位于同一主机上,相反,它们通常位于不同的主机上。你好,世界
在本文的后面,我们将使用MonsterMQ库在PHP中编写两个程序,其中一个将发送消息,另一个将接收并将它们输出到控制台。在下图中,“ P”是提供者,“ C”是使用者,红色框是作为消息缓冲区的队列(每个框是消息)。
(图片取自RabbitMQ官方网站)为了进行进一步的工作,我们需要安装MonsterMQ,为此,请在控制台中输入以下命令:composer require goootlib/monster-mq:dev-master
(有关安装MonsterMQ的更多信息,请参见github.com上的项目页面。)此命令将在当前文件夹中安装MonsterMQ。离开
我们将发送方称为send.php,将接收方称为receive.php。发件人将加入服务器并发送消息。要加入服务器,请在send.php中编写以下代码:try {
$producer = \MonsterMQ\Client\Producer();
$producer->connect('127.0.0.1', 5672);
$producer->logIn('guest', 'guest');
} catch(\Exception $e) {
var_dump($e);
}
在此代码中,我们加入了在标准端口上的本地服务器上运行的RabbitMQ。如果RabbitMQ正在其他地址上运行,请指定其他ip地址和端口。连接之后,我们还调用logIn()方法,该方法以标准的登录名和密码开始会话。如果您有一个在RabbitMQ中配置了不同用户名和密码的帐户,请在此处指定。要发送消息,我们必须声明将首先放置消息的队列。队列宣布后,我们可以发送一条消息:try {
$producer = \MonsterMQ\Client\Producer();
$producer->connect('127.0.0.1', 5672);
$producer->logIn('guest', 'guest');
$producer->queue('test-queue')->declare();
$producer->publish('my-message', 'test-queue');
} catch(\Exception $e) {
var_dump($e);
}
队列声明是幂等的,也就是说,如果队列已经存在,则不会创建并且不会更改队列。完成会议并加入后。try {
$producer = \MonsterMQ\Client\Producer();
$producer->connect('127.0.0.1', 5672);
$producer->logIn('guest', 'guest');
$producer->queue('test-queue')->declare();
$producer->publish('Test message', 'test-queue');
$producer->disconnect();
} catch(\Exception $e) {
var_dump($e);
}
接收讯息
与发件人不同,收件人将保持运行状态以侦听传入的消息。在receive.php代码中,您首先需要执行与send.php中相同的操作:try {
$consumer = \MonsterMQ\Client\Consumer();
$consumer->connect('127.0.0.1', 5672);
$consumer->logIn('guest', 'guest');
$consumer->queue('test-queue')->declare();
} catch(\Exception $e) {
var_dump($e);
}
请注意,在receive.php中,我们还声明了队列,以便接收方在发送方之前启动队列。为了告诉服务器我们要从中接收消息,并开始一个等待和处理传入消息的循环,我们将编写以下代码:try {
$consumer = \MonsterMQ\Client\Consumer();
$consumer->connect('127.0.0.1', 5672);
$consumer->logIn('guest', 'guest');
$consumer->queue('test-queue')->declare();
$consumer->consume('test-queue');
$consumer->wait(function ($message, $channelNumber) use ($consumer){
echo "Message - {$message} received on channel {$channelNumber}";
});
} catch(\Exception $e) {
var_dump($e);
}
发射
现在我们可以将两个脚本作为接收者运行:php receive.php
寄件者:php send.php
接收者将向控制台输出他将从RabbitMQ接收的消息(该消息又将从send.php接收)以及所使用的通道号。它会继续执行,直到您关闭终端,或通过按Ctrl + C停止执行它为止。通过在另一个终端中启动发件人,您可以观察到消息如何传递给收件人并在控制台中显示。如果要查看当前RabbitMQ包含哪些队列以及队列中有多少消息,可以使用Rabbitmqctl作为特权用户来执行此操作sudo rabbitmqctl list_queues
在Windows上不要使用sudorabbitmqctl.bat list_queues
现在,我们准备继续进行下一节的课程。