Redis釋出訂閱機制在PHP中的運用
阿新 • • 發佈:2018-12-30
在寫這篇文章之前,我已經完成實踐,想深入瞭解redis的釋出訂閱模式與實際運用,這種模式為生產者和消費者,可為1-1的關係(為訊息佇列),也可為1-N的關係,據說可運用場景為對資料可靠性要求不高的場景,如日誌。我實踐的小功能是基於WebSockets的這種雙向通訊協議的,主要是解決服務端主動推送資訊到客戶端,替代輪詢這種操作,此demo的github地址https://github.com/titlebaby/even-Communications。
是基於專為PHP打造的第三方包 "cboden/ratchet",有興趣的同學可以看看,他們的官網是 http://socketo.me/
php中的運用,必須要php_redis擴充套件
以下實踐是win10系統
首先,解壓redis的伺服器包,直接雙擊‘redis-server.exe’,啟動redis服務,不要關閉啟動彈出的終端,關聯了終端相當於就又關了redis。
同樣雙擊“redis-cli.exe”輸入subscribe first ,訂閱頻道
分別執行 sub.php,subscribe客服端是堵塞的,可以在終端執行這個php程式碼,效果更明顯一些;更或者讓其一直執行在後臺
nohup /usr/bin/php /path/sub.php >> /tmp/sub.log 2>&1 &
再執行 pub.php,
當執行完pub.php後,在 redis-cli的終端和sub.php會收到“hello world!”則成功。原理需要細想。
#subscribe客服端 sub.php
$redis = new \Redis();
$res = $redis->pconnect('192.168.6.33', 6379);
$key = 'first';
#這裡的subscribe是一個獨佔連結的,你在終端執行名“subscribe first” 後,螢幕將如同開啟redis服務的終端一樣,處於一直線上等一樣。因此此處可以看出訂閱者(客服端)的程式是以阻塞的方式等待,釋出者的訊息。
$redis->subscribe(array($key),'callback');
function callback($redis, $channel , $msg){
var_dump($redis);
echo $channel;
echo $msg;
return true;
}
#public客服端 pub.php
#無需獨佔連結,不是堵塞的
$redis = new \Redis();
$res = $redis->connect('192.168.6.33', 6379, 1 );
$key = 'first';//Channel 訂閱這頻道的訂閱者,都能收收到訊息
$value = 'hello world!';
$res = $redis->publish($key,$value);
說到這裡可以完一小節了。 這裡有個問題是,大規模的請求pub.php檔案,要求釋出訊息,為了抗高併發的釋出訊息,是不是又應該使用佇列(redis),但是我們把訊息都放入到redis的佇列中,怎麼實時的監聽redis中是否有資料,我看大多會說的,就是在linux中經常會用到的定時器。如:
##加一個定時器,修改讓pub.php每個一分鐘去redis中取資料
crontab -e
*/1 * * * * /path/pub.php
但是有沒有更智慧的呢?比如監聽redis的訊息佇列?有就直接通知呢。有點暈了。。。。
最後一點,這個與ratchet不同的是,ratchet會自己在伺服器上啟動一個服務,這樣就能在斷網的情況下,也會往客服端推送訊息。