使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能
前言
今天我們來(lái)做個(gè)小試驗(yàn),用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能。
前期準(zhǔn)備,需要安裝好docker、docker-compose的運(yùn)行環(huán)境。
使用docker部署php服務(wù)的詳細(xì)步驟_docker_腳本之家 (jb51.net)
一、安裝RabbitMQ
1、創(chuàng)建相關(guān)目錄,執(zhí)行如下命令。
mkdir -p /docker/rabbitmq/data cd /docker/rabbitmq
2、編寫(xiě)yaml文件,內(nèi)容如下;version替換成自己的docker-compose版本。
vim docker-compose.yaml
version: '2.2.2'
services:
rabbitmq:
image: rabbitmq
hostname: rabbitmq
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ./data:/var/lib/rabbitmq
networks:
- mynet
networks:
mynet:
name: mynet
driver: bridge3、啟動(dòng)rabbitmq,執(zhí)行如下命令。
docker-compose up -d
4、檢查服務(wù)是否正常運(yùn)行,執(zhí)行如下命令。
docker-compose ps -a
返回如下內(nèi)容,說(shuō)明服務(wù)已正常啟動(dòng),正在運(yùn)行。

5、如果有服務(wù)啟動(dòng)失敗,可以使用如下命令排查問(wèn)題。
docker logs rabbitmq
6、至此,rabbitmq安全完成并且已正常運(yùn)行。
二、安裝PHP的AMQP擴(kuò)展
1、進(jìn)入test1項(xiàng)目容器,執(zhí)行如下命令。
docker exec -ti test1 /bin/sh
2、下載AMQP擴(kuò)展并且完成安裝,執(zhí)行如下命令。
wget https://pecl.php.net/get/amqp-2.1.2.tgz tar -zxvf amqp-2.1.2.tgz cd amqp-2.1.2 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
3、修改php.ini配置,增加amqp擴(kuò)展,內(nèi)容如下。
extension=amqp.so
4、檢查配置是否成功,執(zhí)行如下命令,有返回說(shuō)明已完成安裝。
/usr/local/php/bin/php -m|grep amqp
5、重啟PHP服務(wù), 重啟Web服務(wù)器或PHP-FPM服務(wù)以加載新安裝的AMQP擴(kuò)展。
6、至此,php的amqp擴(kuò)展已完成安裝。
三、測(cè)試驗(yàn)證
1、進(jìn)入test1項(xiàng)目目錄,執(zhí)行如下命令。
cd /docker/test1/html/
2、編寫(xiě)生產(chǎn)者,代碼內(nèi)容如下。
vim producer.php
<?php
// 創(chuàng)建連接到RabbitMQ服務(wù)器的連接
$connection = new AMQPConnection(
[
'host' => 'rabbitmq',
'port' => 5672,
'username' => 'guest',
'password' => 'guest'
]
);
$connection->connect();
// 創(chuàng)建一個(gè)頻道(channel)
$channel = new AMQPChannel($connection);
// 聲明一個(gè)交換機(jī)(exchange)
$exchange = new AMQPExchange($channel);
$exchange->setName('exchange_name');
$exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交換機(jī)類型
$exchange->declareExchange();
// 聲明一個(gè)隊(duì)列
$queue = new AMQPQueue($channel);
$queue->setName('queue_name');
$queue->declareQueue();
// 綁定交換機(jī)到隊(duì)列
$queue->bind('exchange_name', 'routing_key');
// 發(fā)送一條消息
$messageBody = 'Hello, RabbitMQ!'.(!empty($_GET['msg']) ? $_GET['msg'] : '');
$exchange->publish($messageBody, 'routing_key');
// 關(guān)閉連接
$channel->close();
$connection->disconnect();3、編寫(xiě)消費(fèi)者,代碼內(nèi)容如下。
vim consumer.php
<?php
// 創(chuàng)建連接到RabbitMQ服務(wù)器的連接
$connection = new AMQPConnection(
[
'host' => 'rabbitmq',
'port' => 5672,
'username' => 'guest',
'password' => 'guest'
]
);
$connection->connect();
// 創(chuàng)建一個(gè)頻道(channel)
$channel = new AMQPChannel($connection);
// 聲明一個(gè)交換機(jī)(exchange)
$exchange = new AMQPExchange($channel);
$exchange->setName('exchange_name');
$exchange->setType(AMQP_EX_TYPE_DIRECT); // 直接交換機(jī)類型
$exchange->declareExchange();
// 聲明一個(gè)隊(duì)列
$queue = new AMQPQueue($channel);
$queue->setName('queue_name');
$queue->declareQueue();
// 綁定交換機(jī)到隊(duì)列
$queue->bind('exchange_name', 'routing_key');
// 開(kāi)始消費(fèi)消息
$queue->consume(function (AMQPEnvelope $envelope, AMQPQueue $queue) {
if ($envelope->getBody()) {
echo "Received message: ", $envelope->getBody(), "\n";
}
}, AMQP_AUTOACK); // 如果設(shè)置為AMQP_AUTOACK,消息一旦收到就被認(rèn)為已確認(rèn),否則需要手動(dòng)確認(rèn)
// 關(guān)閉連接
$channel->close();
$connection->disconnect();4、進(jìn)入test1項(xiàng)目容器,監(jiān)控消費(fèi)者,執(zhí)行如下命令。
/usr/local/php/bin/php /usr/local/nginx/html/consumer.php
5、在宿主機(jī)發(fā)起一個(gè)生產(chǎn)者請(qǐng)求,執(zhí)行如下命令。
curl "http://127.0.0.1:8081/producer.php?msg=max"
6、正常情況下,會(huì)在test1項(xiàng)目容器看到消費(fèi)者的輸出,類似如下截圖。

7、至此,php和rabbitmq實(shí)現(xiàn)消息隊(duì)列的功能已測(cè)試驗(yàn)證OK。
總結(jié)
用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能,其實(shí)也不復(fù)雜,主要有以下幾個(gè)步驟。
1、安裝RabbitMQ。
2、安裝PHP的AMQP擴(kuò)展。
3、編寫(xiě)生產(chǎn)者、消費(fèi)者進(jìn)行驗(yàn)證。
上面的代碼只是做個(gè)簡(jiǎn)單的示例,如果運(yùn)用到實(shí)際的項(xiàng)目當(dāng)中需要做配置化、封裝。
以上就是使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能的詳細(xì)內(nèi)容,更多關(guān)于PHP RabbitMQ消息隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php實(shí)現(xiàn)的簡(jiǎn)單多進(jìn)程服務(wù)器類完整示例
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單多進(jìn)程服務(wù)器類,結(jié)合完整實(shí)例形式分析了PHP多進(jìn)程服務(wù)器數(shù)據(jù)傳輸、響應(yīng)、處理等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
PHP實(shí)現(xiàn)簡(jiǎn)單注冊(cè)登錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)簡(jiǎn)單注冊(cè)登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
php rmdir使用遞歸函數(shù)刪除非空目錄實(shí)例詳解
我們大家都知道,php rmdir()函數(shù)用于刪除空目錄,但如果要?jiǎng)h除非空目錄,我們必須將非空目錄中的文件或子目錄刪除,本文章向大家介紹php如何使用遞歸函數(shù)刪除非空目錄,需要的朋友可以參考一下2016-10-10
深入理解PHP中mt_rand()隨機(jī)數(shù)的安全
mt_rand()使用mersennetwister算法返回隨機(jī)整數(shù),這個(gè)大家都知道,但下面這篇文章主要給大家介紹的是關(guān)于PHP中mt_rand()隨機(jī)數(shù)安全的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
PHP正則匹配日期和時(shí)間(時(shí)間戳轉(zhuǎn)換)的實(shí)例代碼
本文介紹下,用php實(shí)現(xiàn)正則匹配日期與時(shí)間,并進(jìn)行時(shí)間戳轉(zhuǎn)換的例子,有需要的朋友,參考下吧2016-12-12

