php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
一.場景介紹
最近的一個項目需要用到發(fā)布/訂閱的信息系統(tǒng),以做到最新實時消息的通知。經(jīng)查找后發(fā)現(xiàn)了redis pub/sub(發(fā)布/訂閱的信息系統(tǒng))可以滿足我的開發(fā)需求,而且學(xué)習(xí)成本和使用成本也比較低。
二.什么是redis pub/sub
資料查看
大家在看我的blog的同時可以打開redis官方對于redis pub/sub的介紹,感覺看英文文檔吃力的話 :cry: ,可以看redis中文網(wǎng)的翻譯介紹.
Pub/Sub功能(means Publish, Subscribe)即發(fā)布及訂閱功能
基于事件的系統(tǒng)中,Pub/Sub是目前廣泛使用的通信模型,它采用事件作為基本的通信機(jī)制,提供大規(guī)模系統(tǒng)所要求的松散耦合的交互模式:訂閱者(如客戶端)以事件訂閱的方式表達(dá)出它有興趣接收的一個事件或一類事件;發(fā)布者(如服務(wù)器)可將訂閱者感興趣的事件隨時通知相關(guān)訂閱者。
消息發(fā)布者,即publish客戶端,無需獨占鏈接,你可以在publish消息的同時,使用同一個redis-client鏈接進(jìn)行其他操作(例如:INCR等)
消息訂閱者,即subscribe客戶端,需要獨占鏈接,即進(jìn)行subscribe期間,redis-client無法穿插其他操作,此時client以阻塞的方式等待“publish端”的消息;這一點很好理解,因此subscribe端需要使用單獨的鏈接,甚至需要在額外的線程中使用。三.redis pub sub(publish subscribe)之基本使用
下面我將配著實圖(用我的本地機(jī)器環(huán)境)來為大家講解redis的pub/sub怎么去使用 .
沒有安裝phpredis擴(kuò)展的或者沒有redis服務(wù)的,請參考我的 另一篇blog ,有詳細(xì)的安裝介紹,這里不再贅述了。
1、啟動redis服務(wù)端
DSC0000.jpg (74.7 KB, 下載次數(shù): 39)
2017-12-22 07:35 上傳
2、啟動redis客戶端,并做為subscribe訂閱端
新開一個終端,啟動redis客戶端,并做為subscribe客戶端(消息訂閱者),訂閱一個名字叫test的頻道信息:
DSC0001.jpg (55.64 KB, 下載次數(shù): 40)
2017-12-22 07:35 上傳
3、啟動redis客戶端,并做為publish客戶端
發(fā)布一個名字叫test的頻道,信息是:hello,world
DSC0002.jpg (41.91 KB, 下載次數(shù): 36)
2017-12-22 07:35 上傳
4、查看訂閱到的消息
再切換到2步驟中的redis客戶端窗口,會發(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實現(xiàn)支持模式匹配。
客戶端可以訂閱全風(fēng)格的模式以便接收所有來自能匹配到給定模式的頻道的消息。 比如,將接收所有發(fā)到 test.name,test.phone,test.address...等等的消息,該這樣寫:
PUBSCRIBE test.*
在終端回車后,同時再新的窗口里分別發(fā)布兩個頻道的消息,名字分別為:test.name和test.phone,然后切換到訂閱端的窗口里,結(jié)果如下圖所示:
DSC0004.jpg (82.85 KB, 下載次數(shù): 37)
2017-12-22 07:35 上傳
由上圖可以看出,在訂閱了test.*頻道后,一共收到了 test.name和test.phone兩個頻道的消息,這就是模式匹配訂閱。
那么取消訂閱匹配該模式的客戶端也比較簡單:
PUNSUBSCRIBE test.*
好,以上的這些簡單的demo,就是關(guān)于redis pub/sub(Publish/Subscribe,發(fā)布/訂閱的信息系統(tǒng))的最基本使用。說了這么多,跟php也沒有掛上什么鉤,別著急,重要的都往往最后出場。
四.php redis pub/sub
phpredis的安裝
redis的客戶端連接支持多種語言。這里我用的是php的phpredis,它是用c語言編寫的,目前已經(jīng)作為php的一個模塊擴(kuò)展,沒有安裝的可以參考我的 另一篇blog ,已經(jīng)安裝的可以忽略此步驟.
命令手冊
詳細(xì)請看github 這里 。 這里我列出一些常用的:
Redis::__construct構(gòu)造函數(shù)
$redis = new Redis();
connect, open 鏈接redis服務(wù)
參數(shù)
host: string,服務(wù)地址
port: int,端口號
timeout: float,鏈接時長 (可選, 默認(rèn)為 0 ,不限鏈接時間)
注: 在redis.conf中也有時間,默認(rèn)為300
pconnect, popen 不會主動關(guān)閉的鏈接
參考上面
setOption 設(shè)置redis模式
getOption 查看redis設(shè)置的模式
ping 查看連接狀態(tài)
get 得到某個key的值(string值)
如果該key不存在,return false
set 寫入key 和 value(string值)
如果寫入成功,return ture
setex 帶生存時間的寫入值
$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的個數(shù)(長整數(shù))
$redis->delete('key1', 'key2');
$redis->delete(array('key3', 'key4', 'key5'));
更詳細(xì)的使用請參考這里 ,我就不寫太多,因為我要直接摞代碼了.
publish(消息發(fā)布端):pub.php
/** * redis sub(消息訂閱端)
* @ blog: phping.sinaapp.com
* @date 2016-04-24 15:00
*/
$redis = new Redis();
// 第一個參數(shù)為redis服務(wù)器的ip,第二個為端口
$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客戶端,需要獨占鏈接,即進(jìn)行subscribe期間,redis-client無法穿插其他操作,此時client以阻塞的方式等待“publish端”的消息,所以我們用命令行來執(zhí)行:
php啟動redis訂閱端
則 訂閱消息的redis客戶端已經(jīng)啟動,隨時等待發(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,发布/订阅的信息系统)之基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go语言详解
- 下一篇: android播放flv,Android