Mac安裝
1 安裝
mac安裝我們采用快速的brew的安裝方式
參考:http://www.rabbitmq.com/download.html
- 安裝之前現(xiàn)更新homebrew
brew update # 我這里就不處理了
- 然后安裝RabbitMQ server
brew install rabbitmq
- 安裝過(guò)程及提示
Updating Homebrew...
==> Downloading https://github.com/rabbitmq/rabbitmq-server/releases/download/v3
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws
######################################################################## 100.0%
==> /usr/bin/unzip -qq -j /usr/local/Cellar/rabbitmq/3.8.3/plugins/rabbitmq_mana
==> Caveats
Management Plugin enabled by default at http://localhost:15672
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
To have launchd start rabbitmq now and restart at login:
brew services start rabbitmq
Or, if you don't want/need a background service you can just run:
rabbitmq-server
==> Summary
?? /usr/local/Cellar/rabbitmq/3.8.3: 281 files, 20.4MB, built in 6 seconds
這里已經(jīng)明確的說(shuō)明了
后臺(tái)運(yùn)行命令:brew services start rabbitmq
前臺(tái)啟動(dòng)命令:rabbitmq-server
2 使用
RabbitMQ服務(wù)的腳本和CLI工具安裝在/usr/local/sbin目錄下,該目錄不在環(huán)境變量中,因此需要先把該目錄添加到環(huán)境變量中,才能使用rabbitmq-server命令。
臨時(shí)添加
export PATH=/usr/local/sbin:${PATH}
永久添加
Mac中可以通過(guò)修改以下幾個(gè)文件來(lái)添加環(huán)境變量(按加載順序排列):
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
在此,我們修改~/.bash_profile文件。
首先,打開(kāi)文件:vi ~/.bash_profile
然后在文件末尾添加:export PATH=/usr/local/sbin:${PATH}
啟動(dòng)RabbitMQ
Linux->Centos下yum安裝
參考:
https://www.cnblogs.com/gne-hwz/p/10714321.html
https://www.cnblogs.com/yang-hao/p/11737646.html
yum install rabbitmq-server
Linux安裝
好吧,這段話獻(xiàn)給自己。采坑可怕,一臺(tái)主機(jī)上配置服務(wù),另外一臺(tái)主機(jī)上面做驗(yàn)證那就坑B了。
參考文章:https://blog.csdn.net/qq_42238331/article/details/106427856
- 查看你要安裝的rabbitmq版本和對(duì)應(yīng)的erlang版本
進(jìn)入官網(wǎng)查看要安裝的版本
https://www.rabbitmq.com/which-erlang.html
image.png
我這里選擇最高的版本3.8.5 -
開(kāi)始查找和下載對(duì)應(yīng)的文件
image.png
image.png
image.png
image.png
image.png
因?yàn)镽abbitMq的運(yùn)行依賴erlang,所以還需要下載erlang
下載鏈接 https://www.rabbitmq.com/install-rpm.html


- 安裝
-
安裝erlang
rpm -ivh erlang-22.3-1.el7.x86_64.rpm
-
安裝socat
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install socat
-
安裝RabbotMQ
rpm -ivh rabbitmq-server-3.8.4-1.el7.noarch.rpm
-
安裝web界面插件
rabbitmq-plugins enable rabbitmq_management
-
啟動(dòng)
systemctl start rabbitmq-server
-
添加用戶
rabbitmqctl add_user admin adminadmin123
賦予用戶administrator角色
rabbitmqctl set_user_tags admin administrator
授權(quán)遠(yuǎn)程訪問(wèn)
rabbitmqctl set_permissions -p / admin "." "." ".*"
防火墻配置
# 開(kāi)啟 service firewalld start
# 重啟 service firewalld restart
# 關(guān)閉 service firewalld stop
開(kāi)放端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
重啟防火墻
firewall-cmd --reload
查看已開(kāi)放端口
firewall-cmd --list-ports
-
瀏覽器訪問(wèn)
ip:15672/
image.png
使用前面設(shè)置的用戶名密碼 admin adminadmin123 進(jìn)行登錄
image.png
相關(guān)命令:
- 運(yùn)行命令
后臺(tái)運(yùn)行:brew services start rabbitmq
停止后臺(tái)運(yùn)行:brew services stop rabbitmq
前臺(tái)啟動(dòng)命令:rabbitmq-server
查看狀態(tài):rabbitmqctl status
停止前臺(tái)啟動(dòng):rabbitmqctl stop - 用戶管理命令
查看所有用戶:rabbitmqctl list_users
添加一個(gè)用戶:rabbitmqctl add_user zhaobl 123456
配置權(quán)限:rabbitmqctl set_permissions -p "/" zhaobl "." "." ".*"
查看用戶權(quán)限:rabbitmqctl list_user_permissions zhaobl
設(shè)置tag:rabbitmqctl set_user_tags zhaobl administrator
刪除用戶(安全起見(jiàn),刪除默認(rèn)用戶):rabbitmqctl delete_user guest
PHP擴(kuò)展安裝
Mac版本PHP擴(kuò)展
-
安裝rabbitmq-c
php中的rabbitmq 擴(kuò)展是amqp ,而amqp依賴于rabbitmq-c ,首先需要安裝rabbitmq-c
安裝成功后,我們可以再/usr/local/Cellar下看到rabbitmq-c
image.png -
安裝amqp
使用pecl 安裝amqp,直至出現(xiàn)Set the path to librabbitmq install prefix [autodetect] ,這里我們將rabbitmq-c的路徑復(fù)制過(guò)去,然后回車(我這里路徑為/usr/local/Cellar/rabbitmq-c/0.9.0=>看上一張截圖后面就有安裝位置)
image.png 添加擴(kuò)展到php.ini
amqp安裝成功后,一般會(huì)把安裝amqp.so安裝位置(查看執(zhí)行結(jié)果中有一行:Installing '/usr/local/Cellar/php/**********/amqp.so')打印出來(lái)給你。我們打開(kāi)php.ini配置文件(找不到可以執(zhí)行命令php -i | grep php.ini來(lái)找,也可以find / -name php.ini查找),加上extension=amqp.so(這里個(gè)人建議還是全路徑吧,前面的安裝位置/usr/local/Cellar/php/**********/amqp.so拿過(guò)來(lái)用就是了)文件。
執(zhí)行命令:php -m | grep amqp 就能找到結(jié)果,證明已經(jīng)安裝好了。
Centos版本PHP擴(kuò)展
- 安裝rabbitmq-c
在安裝amqp之前還需要安裝另外一個(gè)通訊擴(kuò)展rabbitmq-c。
去github下載最新版本(目前是0.10.0)的源碼包并解壓縮。
cd rabbitmq-c-0.10.0/
mkdir build && cd build #這一步是在rabbitmq-c的根目錄下創(chuàng)建一個(gè)build子目錄
# 這一步是讓cmake根據(jù)../CMakeList.txt,即rabbitmq-c的根目錄下的CMakeList.txt創(chuàng)建Makefile文件
# Makefile文件會(huì)被創(chuàng)建到build目錄中
# 注意,不要漏后面的'..'
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..
# 這一步是真正的build rabbitmq-c庫(kù)的,注意,不要漏掉點(diǎn) '.'
cmake --build . --target install
到這里就已經(jīng)安裝完成了。不過(guò)這里有一個(gè)坑。你可以看一下/usr/local/rabbitmq-c下的目錄只有include和lib64。因?yàn)楹竺婢幾g安裝amqp擴(kuò)展的時(shí)候系統(tǒng)會(huì)到/usr/local/rabbitmq-c/lib目錄下搜索依賴庫(kù),導(dǎo)致錯(cuò)誤。所以這里需要加一步:
在/usr/local/rabbitmq-c/目錄下
ln -s lib64 lib
- 安裝amqp
# 從pecl官方庫(kù)中下載最新的amqp擴(kuò)展包
# 官網(wǎng)地址:https://pecl.php.net/package/amqp
# 我下的是最新版本
wget https://pecl.php.net/get/amqp-1.10.2.tgz
# 解壓并編譯安裝
cd amqp-1.10.2
phpize
# 這里需要配置 with-php-config 如果不知道自己的php安裝位置,可以執(zhí)行查找命令 find / -name php-config 來(lái)查找。
# --with-librabbitmq-dir 就是前面步驟1執(zhí)行的rabbitmq-c的安裝目錄
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c
make && make install
- 添加擴(kuò)展到php.ini
amqp安裝成功后,一般會(huì)把安裝amqp.so安裝位置(查看執(zhí)行結(jié)果中有一行:Installing '/usr/local/*********/amqp.so')打印出來(lái)給你。我們打開(kāi)php.ini配置文件(找不到可以執(zhí)行命令php -i | grep php.ini來(lái)找,也可以find / -name php.ini查找),加上extension=amqp.so(這里個(gè)人建議還是全路徑吧,前面的安裝位置/usr/local/Cellar/php/**********/amqp.so拿過(guò)來(lái)用就是了)文件。
執(zhí)行命令:php -m | grep amqp 就能找到結(jié)果,證明已經(jīng)安裝好了。
測(cè)試PHP的Amqp
-
查看基本情況
還沒(méi)有任何連接(Connections)
還沒(méi)有任何通道(Channels)
交換機(jī)只有系統(tǒng)默認(rèn)的
還沒(méi)有任何隊(duì)列
- 消費(fèi)者調(diào)試
消費(fèi)者代碼consume.php
<?php
//聲明連接參數(shù)
$config = array(
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
);
//連接broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
//在連接內(nèi)創(chuàng)建一個(gè)通道
$ch = new AMQPChannel($cnn);
//創(chuàng)建一個(gè)交換機(jī)
$ex = new AMQPExchange($ch);
//聲明路由鍵
$routingKey = 'key_1';
//聲明交換機(jī)名稱
$exchangeName = 'exchange_1';
//設(shè)置交換機(jī)名稱
$ex->setName($exchangeName);
//設(shè)置交換機(jī)類型
//AMQP_EX_TYPE_DIRECT:直連交換機(jī)
//AMQP_EX_TYPE_FANOUT:扇形交換機(jī)
//AMQP_EX_TYPE_HEADERS:頭交換機(jī)
//AMQP_EX_TYPE_TOPIC:主題交換機(jī)
$ex->setType(AMQP_EX_TYPE_DIRECT);
//設(shè)置交換機(jī)持久
$ex->setFlags(AMQP_DURABLE);
//聲明交換機(jī)
$ex->declareExchange();
//創(chuàng)建一個(gè)消息隊(duì)列
$q = new AMQPQueue($ch);
//設(shè)置隊(duì)列名稱
$q->setName('queue_1');
//設(shè)置隊(duì)列持久
$q->setFlags(AMQP_DURABLE);
//聲明消息隊(duì)列
$q->declareQueue();
//交換機(jī)和隊(duì)列通過(guò)$routingKey進(jìn)行綁定
$q->bind($ex->getName(), $routingKey);
//接收消息并進(jìn)行處理的回調(diào)方法
function receive($envelope, $queue) {
//休眠兩秒,
sleep(2);
//echo消息內(nèi)容
echo $envelope->getBody()."\n";
//顯式確認(rèn),隊(duì)列收到消費(fèi)者顯式確認(rèn)后,會(huì)刪除該消息
$queue->ack($envelope->getDeliveryTag());
}
//設(shè)置消息隊(duì)列消費(fèi)者回調(diào)方法,并進(jìn)行阻塞
$q->consume("receive");
//$q->consume("receive", AMQP_AUTOACK);//隱式確認(rèn),不推薦
以上是消費(fèi)者代碼,打開(kāi)兩個(gè)命令行/終端

此時(shí)再看RabbitMQ管理界面:
Connections




- 生產(chǎn)者調(diào)試
生產(chǎn)者代碼publisher.php
<?php
// 生產(chǎn)者
$config = array(
'host' => '127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
);
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
$ch = new AMQPChannel($cnn);
$ex = new AMQPExchange($ch);
//消息的路由鍵,一定要和消費(fèi)者端一致
$routingKey = 'key_1';
//交換機(jī)名稱,一定要和消費(fèi)者端一致,
$exchangeName = 'exchange_1';
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange();
//創(chuàng)建10個(gè)消息
for ($i=1;$i<=10;$i++){
sleep(1);//便于區(qū)分
//消息內(nèi)容
$msg = array(
'data' => 'message_'.$i."_".date('Y-m-d H:i:s'),//便于監(jiān)控
'hello' => 'world',
);
//發(fā)送消息到交換機(jī),并返回發(fā)送結(jié)果
//delivery_mode:2聲明消息持久,持久的隊(duì)列+持久的消息在RabbitMQ重啟后才不會(huì)丟失
echo "Send Message:".$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, array('delivery_mode' => 2))."\n";
//代碼執(zhí)行完畢后進(jìn)程會(huì)自動(dòng)退出
}
在執(zhí)行之前,先關(guān)掉前面的兩個(gè)消費(fèi)者,打開(kāi)一個(gè)命令行/終端,輸入php publisher.php,由于生產(chǎn)者不需要阻塞,執(zhí)行完進(jìn)程便退出,所以現(xiàn)在RabbitMQ管理界面中既沒(méi)有Connections也沒(méi)有Channels,但是Queues已經(jīng)被Exchanges投遞過(guò)去了10條消息


因?yàn)槲覀儓?zhí)行生產(chǎn)者之前已經(jīng)關(guān)掉了全部消費(fèi)者,所以此時(shí)消息在隊(duì)列中等待獲取;
因?yàn)樵诎l(fā)送消息時(shí)設(shè)置了delivery_mode:2來(lái)聲明消息持久化,此時(shí)如果重啟RabbitMQ,消息還會(huì)恢復(fù);此時(shí)重新執(zhí)行消費(fèi)者,假設(shè)還是兩個(gè),打開(kāi)兩個(gè)命令行/終端,輸入php consumer.php,我們可以看到消息被消費(fèi),如下圖:

提醒:生產(chǎn)者在生產(chǎn)消息時(shí),如果不存在指定隊(duì)列,并且沒(méi)有創(chuàng)建隊(duì)列,或者隊(duì)列存在但消息路由鍵和交換機(jī)與隊(duì)列綁定的鍵(路由規(guī)則)不一致(直連交換機(jī)必須一致),則消息會(huì)被交換機(jī)丟棄。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。













