在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
2019年12月10日09:54:28 原文:https://www.rabbitmq.com/tutorials/tutorial-one-php.html
介绍
先决条件本教程假定RabbitMQ 已在标准端口(5672)的本地主机上安装并运行。如果您使用其他主机,端口或凭据,则连接设置需要进行调整。 在哪里获得帮助如果您在阅读本教程时遇到困难,可以 通过邮件列表与我们联系。 RabbitMQ是消息代理:它接受并转发消息。您可以将其视为邮局:将要发布的邮件放在邮箱中时,可以确保Mailperson先生或女士最终将邮件传递给收件人。以此类推,RabbitMQ是一个邮箱,一个邮局和一个邮递员。 RabbitMQ与邮局之间的主要区别在于,它不处理纸张,而是接收,存储和转发数据消息的二进制斑点。 RabbitMQ和一般的消息传递使用一些术语。
请注意,生产者,消费者和经纪人不必位于同一主机上。实际上,在大多数应用程序中却没有。一个应用程序既可以是生产者,也可以是消费者。
“Hello World”(使用php-amqplib客户端)在本教程的这一部分中,我们将用PHP编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。我们将介绍php-amqplib API 中的一些细节,仅着眼于此非常简单的事情。这是消息传递的“ Hello World”。 在下图中,“ P”是我们的生产者,“ C”是我们的消费者。中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区。
现在我们已经安装了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发出的消息,因此与发布单个消息的发布者不同,我们将使其继续运行以侦听消息并将其打印出来。 该代码(在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停止它),因此请尝试从另一个终端运行发送方。
|
2022-08-17
2022-09-18
2022-08-17
2022-07-29
2022-08-15
请发表评论