redis 中發布和訂閱可以實現消息的實時傳輸,這里我只是用它的事件驅動,當客戶端發送了消息,服務器端立馬可以接收指令處理相應的業務邏輯。
客戶端
client.php
<?php //發布 $redis = new Redis(); $redis->connect('11.10.1.121', 6379); $message = 'send msg';
#將手機號存放到隊列中 $redis->lPush("phone", "15013028236"); $ret = $redis->publish('subscribe', $message);
服務器端
server.php
<?php //訂閱端 常駐進程 ini_set('default_socket_timeout', -1); //不超時 $redis = new Redis(); $redis->connect('11.10.1.121', 6379); $result = $redis->subscribe(array('subscribe'), 'callback'); function callback($instance, $channelName, $message) { # 回調函數內只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 條命令 # 事件驅動 接到信息后執行業務邏輯 如 發送短信 、郵件等 //請求接口 接口完成發送短信、郵件業務邏輯 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/attrJob'); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); echo curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); }
發送短信示例代碼
public function attrJob(){ //示例代碼 $redis = new Redis(); $redis->connect('11.10.1.121', 6379); $phone = $redis->rPop("phone"); if (!$phone || ctype_digit($phone)) { echo json_encode(['error_code' => 1, 'msg' => "s手機號不能為空!"]); return; } #使用短信接口 echo json_encode(['error_code' => 0, 'msg' => "短信已發送!"]); }
########## 測試1000並發下處理業務邏輯 ############
客戶端
<?php //發布 $redis = new Redis();
$redis->connect('11.10.1.121', 6379); $message = 'send msg'; #測試並發處理 for ($i = 1; $i <= 1000; $i++) { $ret = $redis->publish('subscribe', $message); }
服務器端
<?php //訂閱端 常駐進程 ini_set('default_socket_timeout', -1); //不超時 $redis = new Redis(); $redis->connect('11.10.1.121', 6379); $result = $redis->subscribe(array('subscribe'), 'callback'); function callback($instance, $channelName, $message) { # 回調函數內只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 條命令 # 事件驅動 接到信息后執行業務邏輯 如 發送短信 、郵件等 //訪問接口 點贊數+1 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/giveLike'; curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); echo curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); }
點贊接口
public function giveLike() { $model = M("test"); $model->where('id=4')->setInc('num', 1); // 點贊+1 }
將id =4 的num 重置為0
運行服務器端 ,在運行客戶端后
總結:redis 默認是單線程處理高並發很友好,經常用來處理搶購、秒殺等高並發業務邏輯。