上一篇文章《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