RabbitMQ中文文档PHP版本--打印Hello World

Posted Z.X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ中文文档PHP版本--打印Hello World相关的知识,希望对你有一定的参考价值。

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

 

还有一个适用于WindowsComposer安装程序

现在我们已经安装了php-amqplib库,我们可以编写一些代码。

正在发送

技术图片

我们将其称为消息发布者(发送者)send.php,并将消息接收者 称为receive.php发布者将连接到RabbitMQ,发送一条消息,然后退出。

在 send.php中,我们需要包含该库并使用必要的类:

require_once __DIR__ . ‘/vendor/autoload.php‘;
use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

 

然后我们可以创建到服务器的连接:

$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!‘
";

声明队列是幂等的-仅当队列不存在时才创建。消息内容是一个字节数组,因此您可以在此处编码任何内容。

最后,我们关闭通道和连接;

$channel->close();
$connection->close();

这是整个send.php类

发送不起作用!

如果这是您第一次使用RabbitMQ,但没有看到“已发送”消息,那么您可能会不知所措,想知道可能是什么问题。代理可能是在没有足够可用磁盘空间的情况下启动的(默认情况下,它至少需要200 MB的可用空间),因此拒绝接受消息。检查代理日志文件以确认并减少限制(如有必要)。配置文件文档会告诉你如何设置disk_free_limit

接收

这就是我们的发布者。我们的接收者正在侦听RabbitMQ发出的消息,因此与发布单个消息的发布者不同,我们将使其继续运行以侦听消息并将其打印出来。

技术图片

该代码(在receive.php中)具有send几乎相同的 includeuse

require_once __DIR__ . ‘/vendor/autoload.php‘;
use PhpAmqpLibConnectionAMQPStreamConnection;

设置与发布者相同;我们打开一个连接和一个通道,并声明要消耗的队列。请注意,这与发送发布到的队列匹配

$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
";

请注意,我们也在这里声明队列。因为我们可能在发布者之前启动使用者,所以我们想确保队列存在,然后再尝试从中使用消息。

我们将告诉服务器将队列中的消息传递给我们。我们将定义一个可调用PHP ,它将接收服务器发送的消息。请记住,消息是从服务器异步发送到客户端的。

$callback = function ($msg) {
  echo ‘ [x] Received ‘, $msg->body, "
";
};

$channel->basic_consume(‘hello‘, ‘‘, false, true, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$ channel有回调时,我们的代码将阻塞每当我们收到一条消息时,我们的$ callback函数都会传递给收到的消息。

这是整个receive.php类

放在一起

现在我们可以运行两个脚本。在终端中,运行使用者(接收方):

php receive.php

然后,运行发布者(发送者):

php send.php

消费者将打印通过RabbitMQ从发件人那里得到的消息。接收方将继续运行,等待消息(使用Ctrl-C停止它),因此请尝试从另一个终端运行发送方。

列表队列

您可能希望查看RabbitMQ拥有哪些队列以及队列中有多少条消息。您可以使用rabbitmqctl工具(作为特权用户)进行操作

 

sudo rabbitmqctl list_queues

在Windows上,省略sudo:

 

rabbitmqctl.bat list_queues

 

以上是关于RabbitMQ中文文档PHP版本--打印Hello World的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ中文文档PHP版本--路由

RabbitMQ中文文档PHP版本--发布/订阅

RabbitMQ中文文档PHP版本--发布者确认

RabbitMQ中文文档PHP版本--远程过程调用(RPC)

rabbitmq基础配置中文说明文档

简单可靠的rabbitmq组件包 - php版本