一、前言
在Linux上安装rabbitMQ,并通过浏览器访问控制台,在php中操作rabbitMQ。
二、安装rabbitMQ
rabbitMQ是用Erlang语言编写的,所以安装rabbitMQ需要先安装Erlang,安装完Erlang后在去安装rabbitMQ(两步走)。
2.1 查看版本兼容性(必须)
如果 Erlang 版本和 rabbitMQ 版本不兼容,则无法启动。安装前一定要看下版本的兼容性。
2.2 安装Erlang
在安装前先更新下系统:
yum -y update
Erlang在默认的YUM存储库中不可用,所以需要安装EPEL存储库:
yum -y install epel-release
yum -y update
安装Erlang:
yum -y install erlang socat
查看版本:
erl -version
2.3 安装rabbitMQ
找到和 Erlang 兼容的版本:rpm文件地址,下载后缀为 rpm 的文件。
例如,我的 Erlang 所兼容的rabbitMQ版本地址为(举例子,请严格参考上述网站的版本兼容信息):
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.18/rabbitmq-server-3.8.18-1.el7.noarch.rpm
下载rpm文件:
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.18/rabbitmq-server-3.8.18-1.el7.noarch.rpm
导入GPG密钥:
rpm –import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
运行RPM安装RPM包:
rpm -Uvh rabbitmq-server-3.8.18-1.el7.noarch.rpm
其中,rabbitmq-server-3.8.18-1.el7.noarch.rpm
一定要是你下载的 rpm 文件地址。
三、启动和停止rabbitMQ
开启前,请确保15672端口是否开放,如未开放,请去防火墙或服务商安全组中开放。
#启动服务
systemctl start rabbitmq-server.service
#设置开机启动
systemctl enable rabbitmq-server.service
#停止开机启动
systemctl disable rabbitmq-server.service
#重新启动服务
systemctl restart rabbitmq-server.service
#查看服务当前状态
systemctl status rabbitmq-server.service
#查看所有已启动服务
systemctl list-units --type=service
四、访问Web管理控制台
启动web控制台:
rabbitmq-plugins enable rabbitmq_management
给RabbitMQ用户提供所有权:
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/
给RabbitMQ Web控制台创建管理用户:
rabbitmqctl add_user admin password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
将 admin 设置为首选用户。
其中,admin为用户名,password为密码,其中用户名guest,密码guest为默认用户名和密码。
访问你的ip地址:端口号
,例如我的:http://122.23.63.419:15672
至此,rabbitMQ安装完毕。
如果你需要在php中操作rabbitMQ,请继续往下看,否则,只看上述部分即可。
五、PHP中操作rabbitMQ
php操作 rabbitMQ需要安装以下扩展 amqp 扩展,但是安装 amqp扩展前需要安装 rabbitmq-c。
5.1 安装 rabbitmq-c
wget -c https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz
tar zxf rabbitmq-c-0.8.0.tar.gz
cd rabbitmq-c-0.8.0
./configure --prefix=/usr/local/rabbitmq-c-0.8.0
make && make install
5.2 安装amqp
wget -c http://pecl.php.net/get/amqp-1.9.3.tgz
tar zxf amqp-1.9.3.tgz
cd amqp-1.9.3
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0
make && make install
5.3 修改php.ini配置文件
extension = amqp.so
安装好后重启下fpm。
使用 php -m
查看是否安装成功:
[root@VM-8-5-centos ~]# php -m
[PHP Modules]
amqp
bcmath
Core
ctype
curl
date
dom
event
fileinfo
filter
ftp
gd
gettext
hash
iconv
intl
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
swoole
sysvsem
tokenizer
xml
xmlreader
xmlrpc
xmlwriter
zip
zlib
[Zend Modules]
5.4 在php中的使用
server.php
(生产):
<?php
$e_name = 'e_test'; //交换机名
$q_name = 'q_test'; //队列名
$k_route = 'route_test'; //路由key
//创建连接和channel
$conn = new AMQPConnection();
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
//在连接内创建一个通道
$channel = new AMQPChannel($conn);
//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
//设置交换机类型
$ex->setType(AMQP_EX_TYPE_DIRECT);
//设置交换机持久
$ex->setFlags(AMQP_DURABLE);
//声明交换机并输出状态
echo "Exchange Status:" . $ex->declareExchange() . "\n";
//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
//设置队列持久
$q->setFlags(AMQP_DURABLE);
//声明消息队列并输出状态
echo "Message Total:" . $q->declareQueue() . "\n";
//绑定交换机与队列,并指定路由键
echo 'Queue Bind: ' . $q->bind($e_name, $k_route) . "\n";
//阻塞模式接收消息
echo "waiting reeive Message...\n";
//接收消息并进行处理的回调方法
function processMessage($envelope, $queue)
{
//取消息内容
$msg = $envelope->getBody();
// echo $msg . "\n"; //处理消息
//显式确认,队列收到消费者显式确认后,会删除该消息
print_r($envelope->getDeliveryTag());
$queue->ack($envelope->getDeliveryTag());
}
//设置消息队列消费者回调方法,并进行阻塞
$q->consume('processMessage');
//下面是隐式确认,不推荐
//$q->consume('processMessage', AMQP_AUTOACK);
$conn->disconnect();
client.php
(消费):
<?php
$e_name = 'e_test'; //交换机名,和服务端一至
$k_route = 'route_test'; //路由key,和服务端一至
//创建连接和channel
$conn = new AMQPConnection();
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//创建交换机对象
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
$ex->declareExchange();
//发送消息
//$channel->startTransaction(); //开始事务
for ($i = 0; $i < 1115; ++$i) {
sleep(1); //休眠1秒
//消息内容
$message = "TEST MESSAGE!" . date("h:i:sa");
echo "Send Message:" .$i.",发送状态". $ex->publish($message, $k_route) . "\n";
}
//$channel->commitTransaction(); //提交事务
$conn->disconnect();
在cli下,开两个窗口,运行这两个文件即可,配合着web控制台管理。