redis 發布訂閱實現異步實時發短信


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 默認是單線程處理高並發很友好,經常用來處理搶購、秒殺等高並發業務邏輯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM