使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能
前言
今天我們來做個(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、編寫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: bridge
3、啟動rabbitmq,執(zhí)行如下命令。
docker-compose up -d
4、檢查服務(wù)是否正常運(yùn)行,執(zhí)行如下命令。
docker-compose ps -a
返回如下內(nèi)容,說明服務(wù)已正常啟動,正在運(yùn)行。
5、如果有服務(wù)啟動失敗,可以使用如下命令排查問題。
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í)行如下命令,有返回說明已完成安裝。
/usr/local/php/bin/php -m|grep amqp
5、重啟PHP服務(wù), 重啟Web服務(wù)器或PHP-FPM服務(wù)以加載新安裝的AMQP擴(kuò)展。
6、至此,php的amqp擴(kuò)展已完成安裝。
三、測試驗(yàn)證
1、進(jìn)入test1項(xiàng)目目錄,執(zhí)行如下命令。
cd /docker/test1/html/
2、編寫生產(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、編寫消費(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'); // 開始消費(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),否則需要手動確認(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)者請求,執(zhí)行如下命令。
curl "http://127.0.0.1:8081/producer.php?msg=max"
6、正常情況下,會在test1項(xiàng)目容器看到消費(fèi)者的輸出,類似如下截圖。
7、至此,php和rabbitmq實(shí)現(xiàn)消息隊(duì)列的功能已測試驗(yàn)證OK。
總結(jié)
用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能,其實(shí)也不復(fù)雜,主要有以下幾個(gè)步驟。
1、安裝RabbitMQ。
2、安裝PHP的AMQP擴(kuò)展。
3、編寫生產(chǎn)者、消費(fèi)者進(jìn)行驗(yàn)證。
上面的代碼只是做個(gè)簡單的示例,如果運(yùn)用到實(shí)際的項(xiàng)目當(dāng)中需要做配置化、封裝。
以上就是使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列功能的詳細(xì)內(nèi)容,更多關(guān)于PHP RabbitMQ消息隊(duì)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php下利用curl判斷遠(yuǎn)程文件是否存在的實(shí)現(xiàn)代碼
php下利用curl判斷遠(yuǎn)程文件是否存在的實(shí)現(xiàn)代碼,我們有些程序因需要事先判斷文件是否存在然后再進(jìn)行后面的操作。2011-10-10php數(shù)組函數(shù)序列之in_array() 查找數(shù)組值是否存在
in_array() 函數(shù)在數(shù)組中搜索給定的值2011-10-10PHP實(shí)現(xiàn)通用alert函數(shù)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)通用alert函數(shù)的方法,實(shí)例分析了php自定義alert函數(shù)實(shí)現(xiàn)提示信息的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03PDO版本問題 Invalid parameter number: no parameters were bound
發(fā)現(xiàn)在客戶的某個(gè)PHP版本下,執(zhí)行某類操作的時(shí)候,總是會報(bào)如下錯誤 Invalid parameter number: no parameters were bound,經(jīng)google,發(fā)現(xiàn)是php版本過低導(dǎo)致2013-01-01PHP警告Cannot use a scalar value as an array的解決方法
PHP警告Cannot use a scalar value as an array的解決方法,需要的朋友可以參考下。2012-01-01PHP人民幣金額數(shù)字轉(zhuǎn)中文大寫的函數(shù)代碼
在網(wǎng)上看到一個(gè)非常有趣的PHP人民幣金額數(shù)字轉(zhuǎn)中文大寫的函數(shù),其實(shí)質(zhì)就是數(shù)字轉(zhuǎn)換成中文大寫,測試了一下,非常有趣,隨便輸個(gè)數(shù)字,就可以將其大寫打印出來,新手朋友們試一下吧2013-02-02詳解如何使用PHP實(shí)現(xiàn)動態(tài)代理IP的功能
動態(tài)代理IP是一種通過不斷切換不同的代理IP來隱藏真實(shí)IP地址的技術(shù),動態(tài)代理IP可以有效地解決IP被封鎖或訪問限制的問題,本文將使用PHP語言實(shí)現(xiàn)動態(tài)代理IP的功能,需要的朋友可以參考下2024-03-03