使用PHP和Redis實(shí)現(xiàn)消息隊(duì)列功能
前言
今天,我們繼續(xù)講消息隊(duì)列,如何使用Redis實(shí)現(xiàn)消息隊(duì)列的功能。
前期準(zhǔn)備,需要安裝好docker、docker-compose的運(yùn)行環(huán)境。
PHP的項(xiàng)目運(yùn)行環(huán)境可以參考下面的文章內(nèi)容。
前面我們也講了PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列的功能,感興趣的可以查看下面的文章。
如何使用PHP和RabbitMQ實(shí)現(xiàn)消息隊(duì)列?
一、安裝Redis
1、安裝Redis的步驟可以參考下面的文章內(nèi)容。
Redis不同的持久化方式有什么差異?我們來(lái)做個(gè)小試驗(yàn)。
二、安裝PHP的Redis擴(kuò)展
1、打開(kāi)瀏覽器,找到擴(kuò)展下載地址,PECL :: Package :: redis。
2、進(jìn)入test1項(xiàng)目容器,執(zhí)行如下命令。
docker exec -ti test1 sh
3、下載擴(kuò)展,編譯安裝,執(zhí)行如下命令。
wget https://pecl.php.net/get/redis-6.0.2.tgz tar -xzvf redis-6.0.2.tgz cd redis-6.0.2/ phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
4、增加redis擴(kuò)展修改php.ini配置,增加如下內(nèi)容。
extension=redis.so
5、檢查擴(kuò)展是否配置成功,執(zhí)行如下命令。
php -m|grep redis
返回如下內(nèi)容,說(shuō)明已安裝完成。
6、至此,PHP的Redis擴(kuò)展已安裝完成。
三、測(cè)試驗(yàn)證
1、編寫生產(chǎn)者,代碼內(nèi)容如下。
vim producer.php <?php // 創(chuàng)建Redis實(shí)例 $redis = new Redis(); try { // 連接到Redis服務(wù)器 $redis->connect('redis', 6379); echo "成功連接到Redis服務(wù)器!\r\n"; // 將消息入隊(duì)(添加到列表的尾部) $datetime = date('Y/m/d H:i:s'); $message = 'Hello Max!'; $redis->rPush('message_queue', $message); echo "消息已入隊(duì),datetime={$datetime},message={$message}\r\n"; } catch (RedisException $e) { // 處理連接錯(cuò)誤 echo "無(wú)法連接到Redis服務(wù)器: " . $e->getMessage(); } // 關(guān)閉Redis連接 $redis->close();
2、編寫消費(fèi)者,代碼內(nèi)容如下。
vim consumer.php <?php // 創(chuàng)建Redis實(shí)例 $redis = new Redis(); try { // 連接到Redis服務(wù)器 $redis->connect('redis', 6379); echo "成功連接到Redis服務(wù)器!\r\n"; while (true) { // 可以使用BLPOP命令來(lái)阻塞等待消息 $message = $redis->blPop('message_queue', 0); // 0表示無(wú)限等待 if ($message !== null) { $datetime = date('Y/m/d H:i:s'); list($queue, $msg) = $message; echo "消息出列,datetime={$datetime},queue=${queue},message=${msg}\r\n"; } usleep(100); } } catch (RedisException $e) { // 處理連接錯(cuò)誤 echo "無(wú)法連接到Redis服務(wù)器: " . $e->getMessage(); } // 關(guān)閉Redis連接 $redis->close();
3、啟動(dòng)消費(fèi)端,執(zhí)行如下命令。
php consumer.php
正常情況會(huì)返回如下內(nèi)容,開(kāi)始監(jiān)聽(tīng)消息。
4、運(yùn)行生產(chǎn)端,執(zhí)行如下命令。
php producer.php
正常情況會(huì)返回如下內(nèi)容。
5、再看消費(fèi)端接收到的消息,正常返回如下內(nèi)容。
上面的截圖是執(zhí)行了三次生產(chǎn)端,生成了三條消息。
6、至此,PHP和Redis實(shí)現(xiàn)消息隊(duì)列的功能已驗(yàn)證完成。
總結(jié)
其實(shí)PHP和Redis實(shí)現(xiàn)消息隊(duì)列的功能,使用的是Redis的List這種數(shù)據(jù)結(jié)構(gòu)。
使用rPush入列、blPop出列,實(shí)現(xiàn)隊(duì)列的先進(jìn)先出(FIFO)。
也可以使用lPush入列、blPop出列,來(lái)實(shí)現(xiàn)隊(duì)列的先進(jìn)后出(FILO)。
實(shí)現(xiàn)PHP和Redis消息隊(duì)列的功能,其實(shí)就以下三個(gè)步驟。
1、安裝Redis。
2、安裝PHP的Redis擴(kuò)展。
3、編寫生產(chǎn)者、消費(fèi)者代碼進(jìn)行測(cè)試驗(yàn)證。
上面的代碼只是做個(gè)簡(jiǎn)單的示例,如果運(yùn)用到實(shí)際的項(xiàng)目當(dāng)中需要做進(jìn)一步的優(yōu)化。
到此這篇關(guān)于使用PHP和Redis實(shí)現(xiàn)消息隊(duì)列功能的文章就介紹到這了,更多相關(guān)PHP Redis消息隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WordPress中限制非管理員用戶在文章后只能評(píng)論一次
這篇文章主要介紹了WordPress中限制非管理員用戶在文章后只能評(píng)論一次的方法,同時(shí)介紹了判斷用戶是否為管理員的方法,需要的朋友可以參考下2015-12-12html靜態(tài)頁(yè)面調(diào)用php文件的方法
這篇文章主要介紹了html靜態(tài)頁(yè)面調(diào)用php文件的方法,在進(jìn)行應(yīng)用程序開(kāi)發(fā)過(guò)程中非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11PHP新手NOTICE錯(cuò)誤常見(jiàn)解決方法
PHP新手NOTICE錯(cuò)誤,特此寫給那些遇到和我一樣錯(cuò)誤的朋友。2011-12-12