2019年12月10日09:54:28
原文:https://www.rabbitmq.com/tutorials/tutorial-one-php.html
介绍
先决条件
本教程假定RabbitMQ 已在标准端口(5672)的本地主机上安装并运行。如果您使用其他主机,端口或凭据,则连接设置需要进行调整。
在哪里获得帮助
如果您在阅读本教程时遇到困难,可以 通过邮件列表与我们联系。
RabbitMQ是消息代理:它接受并转发消息。您可以将其视为邮局:将要发布的邮件放在邮箱中时,可以确保Mailperson先生或女士最终将邮件传递给收件人。以此类推,RabbitMQ是一个邮箱,一个邮局和一个邮递员。
RabbitMQ与邮局之间的主要区别在于,它不处理纸张,而是接收,存储和转发数据消息的二进制斑点。
RabbitMQ和一般的消息传递使用一些术语。
- 生产仅意味着发送。发送消息的程序是生产者:
- 队列是RabbitMQ内部的邮箱的名称。尽管消息流经RabbitMQ和您的应用程序,但它们只能存储在队列中。甲队列仅由主机的存储器&磁盘限制约束,它本质上是一个大的消息缓冲器。许多生产者可以发送进入一个队列的消息,许多消费者可以尝试从一个队列接收数据。这就是我们表示队列的方式:
- 消费与接收具有相似的含义。一个消费者是一个程序,主要是等待接收信息:
请注意,生产者,消费者和经纪人不必位于同一主机上。实际上,在大多数应用程序中却没有。一个应用程序既可以是生产者,也可以是消费者。
“Hello World”
(使用php-amqplib客户端)
在本教程的这一部分中,我们将用PHP编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。我们将介绍php-amqplib API 中的一些细节,仅着眼于此非常简单的事情。这是消息传递的“ Hello World”。
在下图中,“ P”是我们的生产者,“ C”是我们的消费者。中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区。
php-amqplib客户端库
RabbitMQ使用多种协议。本教程介绍了AMQP 0-9-1,这是一个开放的通用消息传递协议。RabbitMQ有许多不同语言的客户。在本教程中,我们将使用php-amqplib,并使用Composer 进行依赖项管理。
将composer.json文件添加到您的项目中:
{ "require": { "php-amqplib/php-amqplib": ">=2.9.0" } }前提是已安装Composer并正常运行,则可以运行以下命令:
composer.phar install还有一个适用于Windows的Composer安装程序。
现在我们已经安装了php-amqplib库,我们可以编写一些代码。
正在发送
我们将其称为消息发布者(发送者)send.php,并将消息接收者 称为receive.php。发布者将连接到RabbitMQ,发送一条消息,然后退出。
在 send.php中,我们需要包含该库并使用必要的类:
require_once __DIR__ . ‘/vendor/autoload.php‘; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage;
然后我们可以创建到服务器的连接:
$connection = new AMQPStreamConnection(‘localhost‘, 5672, ‘guest‘, ‘guest‘); $channel = $connection->channel();
该连接抽象了套接字连接,并为我们处理协议版本协商和身份验证等。在这里,我们连接到本地计算机上的代理,即本地 主机。如果我们想连接到另一台计算机上的代理,则只需在此处指定其名称或IP地址。
接下来,我们创建一个通道,该通道是用于完成工作的大多数API所在的位置。
要发送,我们必须声明要发送到的队列。然后我们可以将消息发布到队列:
$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->close(); $connection->close();
发送不起作用!
如果这是您第一次使用RabbitMQ,但没有看到“已发送”消息,那么您可能会不知所措,想知道可能是什么问题。代理可能是在没有足够可用磁盘空间的情况下启动的(默认情况下,它至少需要200 MB的可用空间),因此拒绝接受消息。检查代理日志文件以确认并减少限制(如有必要)。该配置文件文档会告诉你如何设置disk_free_limit。
接收
这就是我们的发布者。我们的接收者正在侦听RabbitMQ发出的消息,因此与发布单个消息的发布者不同,我们将使其继续运行以侦听消息并将其打印出来。
该代码(在receive.php中)具有与send几乎相同的 include和use:
require_once __DIR__ . ‘/vendor/autoload.php‘; use PhpAmqpLib\Connection\AMQPStreamConnection;
设置与发布者相同;我们打开一个连接和一个通道,并声明要消耗的队列。请注意,这与发送发布到的队列匹配。
$connection = new AMQPStreamConnection(‘localhost‘, 5672, ‘guest‘, ‘guest‘); $channel = $connection->channel(); $channel->queue_declare(‘hello‘, false, false, false, false); echo " [*] Waiting for messages. To exit press CTRL+C\n";
请注意,我们也在这里声明队列。因为我们可能在发布者之前启动使用者,所以我们想确保队列存在,然后再尝试从中使用消息。
我们将告诉服务器将队列中的消息传递给我们。我们将定义一个可调用的PHP ,它将接收服务器发送的消息。请记住,消息是从服务器异步发送到客户端的。
$callback = function ($msg) { echo ‘ [x] Received ‘, $msg->body, "\n"; }; $channel->basic_consume(‘hello‘, ‘‘, false, true, false, false, $callback); while ($channel->is_consuming()) { $channel->wait(); }
当$ channel有回调时,我们的代码将阻塞。每当我们收到一条消息时,我们的$ callback函数都会传递给收到的消息。
放在一起
现在我们可以运行两个脚本。在终端中,运行使用者(接收方):
php receive.php
然后,运行发布者(发送者):
php send.php
消费者将打印通过RabbitMQ从发件人那里得到的消息。接收方将继续运行,等待消息(使用Ctrl-C停止它),因此请尝试从另一个终端运行发送方。
列表队列
您可能希望查看RabbitMQ拥有哪些队列以及队列中有多少条消息。您可以使用rabbitmqctl工具(作为特权用户)进行操作:
sudo rabbitmqctl list_queues在Windows上,省略sudo:
rabbitmqctl.bat list_queues
原文地址:https://www.cnblogs.com/zx-admin/p/12014927.html