最近學習了一下php-redis相關的知識,其中有一個功能叫發布訂閱,Redis 發布訂閱(pub/sub)是一種消息通信模式,發送者(pub)發送消息,訂閱者(sub)接收消息。
直接上php代碼如下:
普通 - 【發送者pub】- pub.php
1 $redis = new Redis(); 2 $redis->connect('127.0.0.1', 6379); 3 $redis->auth('requirepass'); 4 5 $res = $redis->publish('channel', date('Y-m-d H:i:s')); 6 var_dump($res); //成功返回1,失敗返回0
普通 - 【訂閱者sub】- sub.php
1 $redis = new Redis(); 2 $redis->connect('127.0.0.1', 6379); 3 $redis->auth('requirepass'); 4 $redis->setOption(Redis::OPT_READ_TIMEOUT, -1); 5 6 function callback ($redisObj, $channel, $msg){ 7 echo 'ChannelName is '.$channel.', Msg is '.$msg; //ChannelName is channel, Msg is 2019-07-17 09:53:55 8 } 9 $redis->subscribe(['channel'], 'callback');
這種發送和訂閱的原理可以理解成一端發送,另外一端馬上收到消息,確切的說就是通過向channel頻道發送消息,其他訂閱了channel頻道的端都可以立馬收到消息。
【設置有效期的鍵值】 - pub.php
1 $job = 'notify#' . date('YmdHis'); 2 $res = $redis->setex($job, 10, 'waiting'); 3 var_dump($res); //成功返回bool(true),失敗返回bool(false)
【鍵空間消息訂閱】- sub.php
1 $redisKey = '__keyevent@0__:expired'; //這個格式是固定的,0表示第一個庫,redis默認使用第一個庫0 2 $redis->psubscribe([$redisKey], 'callBack'); 3 function callBack($redisObj, $pattern, $channel, $msg) { 4 echo $msg."\r\n"; //notify#20190717100350 5 }
這種發送和訂閱的原理可以理解成當鍵值過期的時候會自動發送消息,另外一端開啟了鍵空間消息的訂閱就可以收到消息了。
特別說明:因為訂閱事件啟動后是阻塞執行的,所以需要一直掛着終端等待訂閱,這種情況只能滿足測試開發,如果是實際應用就不行了,這個時候我們希望監聽后台始終運行希望像守護進程一樣在后台,Linux系統中,可以使用nohup命令,具體用法待續。