PHP使用RabbitMQ入门1——hello,world

上一篇文章《CentOS7安装RabbitMQ 3.8.0》安装好了RabbitMQ,本篇通过最简单的PHP示例先让它跑起来。

RabbitMQ使用的是AMQP协议。要使用它就必须需要一个使用同样协议的库。几乎所有的编程语言都有可选择的库。PHP也是一样。

安装php-amqplib客户端库

添加一个 composer.json文件:

{
     "require": {
      "php-amqplib/php-amqplib": "2.6.1"
     }
 }

安装php-amqplib

composer install

创建send.php用于生产消息

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('x.x.x.x', 5672, 'guest', 'guest');   //x.x.x.x为rabbitmq服务器的地址,如果是本地则为localhost
$channel = $connection->channel();
$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服务的连接地址不是localhost,那么运行后会报错:

打开rabbitmq的日志(/var/log/rabbitmq)显示:

HTTP access denied: user 'guest' - User can only log in via localhost

意思是guest用户只能在localhost登录。

解决办法:
rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。我的是3.8.0

如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.0/ebin/rabbit.app)中设置
loopback_users为[]。

找到rabbit.app文件文件完整内容如下(注意后面的半角句号):
找到:loopback_users里的<<”guest”>>删除。

{loopback_users, []},

然后重启

systemctl restart rabbitmq-server.service

如果提示:NOT_ALLOWED – access to vhost ‘/’ refused for user ‘guest’,
原因是连接rabbitmq使用的用户没有赋予访问权限,给用户赋予‘/’目录的访问权限就可以,执行如下命令:

rabbitmqctl  set_permissions -p / guest '.*' '.*' '.*'

最后运行结果如下:

列出队列(Listing queues)

在rabbitmq服务器运行命令可以查看有多少消息存在其中:

rabbitmqctl list_queues。

从结果可以看出hello队列里存有一条消息。

创建recevie.php用于消费消息

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('x.x.x.x', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('hello', false, false, false, false);

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

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

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

while(count($channel->callbacks)) {
    $channel->wait();
}

运行recevie.php:

运行后,将之前生产的消息显示出来了。

此时再在rabbit服务器执行命令:

rabbitmqctl list_queues

可以看到消息变为0了。
当再次执行send.php时,recevie.php会立即消费(显示)send.php生产的消息。

总结

RabbitMQ是一个消息代理,用来发送和接收消息。它就像邮局一样,把送信人的信件交给收信人。而送信人就是生产者,收信人就是消费者,而保管信件的就是RabbitMQ。与邮局不同的是,RabbitMQ只是将送信人的信件保存了起来,需要收信人自己到邮局里取。也就是说生产者发送信息给RabbitMQ,RabbitMQ将该消息存储在了Queue中,然后消费者主动来取。

参考:
https://xiaoxiami.gitbook.io/rabbitmq_into_chinese_php/ying-yong-jiao-cheng/php-ban/1-hello_world

RabbitMq入门以及使用教程

发表评论

邮箱地址不会被公开。 必填项已用*标注