日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

發(fā)布時(shí)間:2023/12/10 php 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.場(chǎng)景介紹

最近的一個(gè)項(xiàng)目需要用到發(fā)布/訂閱的信息系統(tǒng),以做到最新實(shí)時(shí)消息的通知。經(jīng)查找后發(fā)現(xiàn)了redis pub/sub(發(fā)布/訂閱的信息系統(tǒng))可以滿足我的開發(fā)需求,而且學(xué)習(xí)成本和使用成本也比較低。

二.什么是redis pub/sub

資料查看

大家在看我的blog的同時(shí)可以打開redis官方對(duì)于redis pub/sub的介紹,感覺看英文文檔吃力的話 :cry: ,可以看redis中文網(wǎng)的翻譯介紹.

Pub/Sub功能(means Publish, Subscribe)即發(fā)布及訂閱功能

基于事件的系統(tǒng)中,Pub/Sub是目前廣泛使用的通信模型,它采用事件作為基本的通信機(jī)制,提供大規(guī)模系統(tǒng)所要求的松散耦合的交互模式:訂閱者(如客戶端)以事件訂閱的方式表達(dá)出它有興趣接收的一個(gè)事件或一類事件;發(fā)布者(如服務(wù)器)可將訂閱者感興趣的事件隨時(shí)通知相關(guān)訂閱者。

消息發(fā)布者,即publish客戶端,無需獨(dú)占鏈接,你可以在publish消息的同時(shí),使用同一個(gè)redis-client鏈接進(jìn)行其他操作(例如:INCR等)

消息訂閱者,即subscribe客戶端,需要獨(dú)占鏈接,即進(jìn)行subscribe期間,redis-client無法穿插其他操作,此時(shí)client以阻塞的方式等待“publish端”的消息;這一點(diǎn)很好理解,因此subscribe端需要使用單獨(dú)的鏈接,甚至需要在額外的線程中使用。三.redis pub sub(publish subscribe)之基本使用

下面我將配著實(shí)圖(用我的本地機(jī)器環(huán)境)來為大家講解redis的pub/sub怎么去使用 .

沒有安裝phpredis擴(kuò)展的或者沒有redis服務(wù)的,請(qǐng)參考我的 另一篇blog ,有詳細(xì)的安裝介紹,這里不再贅述了。

1、啟動(dòng)redis服務(wù)端

DSC0000.jpg (74.7 KB, 下載次數(shù): 39)

2017-12-22 07:35 上傳

2、啟動(dòng)redis客戶端,并做為subscribe訂閱端

新開一個(gè)終端,啟動(dòng)redis客戶端,并做為subscribe客戶端(消息訂閱者),訂閱一個(gè)名字叫test的頻道信息:

DSC0001.jpg (55.64 KB, 下載次數(shù): 40)

2017-12-22 07:35 上傳

3、啟動(dòng)redis客戶端,并做為publish客戶端

發(fā)布一個(gè)名字叫test的頻道,信息是:hello,world

DSC0002.jpg (41.91 KB, 下載次數(shù): 36)

2017-12-22 07:35 上傳

4、查看訂閱到的消息

再切換到2步驟中的redis客戶端窗口,會(huì)發(fā)現(xiàn),已經(jīng)訂閱到了剛才發(fā)布的 'hello,world'消息:

DSC0003.jpg (64.59 KB, 下載次數(shù): 36)

2017-12-22 07:35 上傳

其中,test為頻道名稱,hello,world即為消息

5、模式匹配訂閱

Redis 的Pub/Sub實(shí)現(xiàn)支持模式匹配。

客戶端可以訂閱全風(fēng)格的模式以便接收所有來自能匹配到給定模式的頻道的消息。 比如,將接收所有發(fā)到 test.name,test.phone,test.address...等等的消息,該這樣寫:

PUBSCRIBE test.*

在終端回車后,同時(shí)再新的窗口里分別發(fā)布兩個(gè)頻道的消息,名字分別為:test.name和test.phone,然后切換到訂閱端的窗口里,結(jié)果如下圖所示:

DSC0004.jpg (82.85 KB, 下載次數(shù): 37)

2017-12-22 07:35 上傳

由上圖可以看出,在訂閱了test.*頻道后,一共收到了 test.name和test.phone兩個(gè)頻道的消息,這就是模式匹配訂閱。

那么取消訂閱匹配該模式的客戶端也比較簡(jiǎn)單:

PUNSUBSCRIBE test.*

好,以上的這些簡(jiǎn)單的demo,就是關(guān)于redis pub/sub(Publish/Subscribe,發(fā)布/訂閱的信息系統(tǒng))的最基本使用。說了這么多,跟php也沒有掛上什么鉤,別著急,重要的都往往最后出場(chǎng)。

四.php redis pub/sub

phpredis的安裝

redis的客戶端連接支持多種語言。這里我用的是php的phpredis,它是用c語言編寫的,目前已經(jīng)作為php的一個(gè)模塊擴(kuò)展,沒有安裝的可以參考我的 另一篇blog ,已經(jīng)安裝的可以忽略此步驟.

命令手冊(cè)

詳細(xì)請(qǐng)看github 這里 。 這里我列出一些常用的:

Redis::__construct構(gòu)造函數(shù)

$redis = new Redis();

connect, open 鏈接redis服務(wù)

參數(shù)

host: string,服務(wù)地址

port: int,端口號(hào)

timeout: float,鏈接時(shí)長(zhǎng) (可選, 默認(rèn)為 0 ,不限鏈接時(shí)間)

注: 在redis.conf中也有時(shí)間,默認(rèn)為300

pconnect, popen 不會(huì)主動(dòng)關(guān)閉的鏈接

參考上面

setOption 設(shè)置redis模式

getOption 查看redis設(shè)置的模式

ping 查看連接狀態(tài)

get 得到某個(gè)key的值(string值)

如果該key不存在,return false

set 寫入key 和 value(string值)

如果寫入成功,return ture

setex 帶生存時(shí)間的寫入值

$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.

setnx 判斷是否重復(fù)的,寫入值

$redis->setnx('key', 'value');

$redis->setnx('key', 'value');

delete 刪除指定key的值

返回已經(jīng)刪除key的個(gè)數(shù)(長(zhǎng)整數(shù))

$redis->delete('key1', 'key2');

$redis->delete(array('key3', 'key4', 'key5'));

更詳細(xì)的使用請(qǐng)參考這里 ,我就不寫太多,因?yàn)槲乙苯愚a了.

publish(消息發(fā)布端):pub.php

/**  * redis sub(消息訂閱端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

// 第一個(gè)參數(shù)為redis服務(wù)器的ip,第二個(gè)為端口

$res = $redis->connect('127.0.0.1', 6379);

// test為發(fā)布的頻道名稱,hello,world為發(fā)布的消息

$res = $redis->publish('test','hello,world');

subscribe(消息訂閱端): sub.php

/**  * redis sub(消息訂閱端)

* @ blog: phping.sinaapp.com

* @date 2016-04-24 15:00

*/

$redis = new Redis();

$res = $redis->pconnect('127.0.0.1', 6379,0);

$redis->subscribe(array('test'), 'callback');

// 回調(diào)函數(shù),這里寫處理邏輯

function callback($instance, $channelName, $message) {

echo $channelName, "==>", $message,PHP_EOL;

}

開始訂閱redis消息

前面已經(jīng)提到過,消息訂閱者,即subscribe客戶端,需要獨(dú)占鏈接,即進(jìn)行subscribe期間,redis-client無法穿插其他操作,此時(shí)client以阻塞的方式等待“publish端”的消息,所以我們用命令行來執(zhí)行:

php啟動(dòng)redis訂閱端

則 訂閱消息的redis客戶端已經(jīng)啟動(dòng),隨時(shí)等待發(fā)布過來的消息并訂閱該消息. 發(fā)布redis消息 同樣,命令行執(zhí)行消息發(fā)布端的腳本即可:

php pub.php

切換到消息訂閱端的窗口

發(fā)現(xiàn)終端有輸出,如下圖

DSC0005.jpg (21.7 KB, 下載次數(shù): 39)

2017-12-22 07:35 上傳

哈哈,是不是 收到了發(fā)布端發(fā)布的'hello,world'這條消息呢。

總結(jié)

以上是生活随笔為你收集整理的php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。