workerman

好久之前寫的功能 發(fā)現(xiàn)都忘了 記錄一下

<?php
    use Workerman\Worker;
    use think\worker\Server;
    use Workerman\Lib\Timer;
    define('HEARTBEAT_TIME', 30); //心跳30秒
    global $worker;
    $worker = new Worker('websocket://0.0.0.0:1234');
    // 這里進程數(shù)必須設(shè)置為1
    $worker->count = 1;
    // worker進程啟動后建立一個內(nèi)部通訊端口
    $worker->onWorkerStart = function($worker)
    {
        // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
        $inner_text_worker = new Worker('Text://0.0.0.0:5678');
        $inner_text_worker->onMessage = function($connection, $buffer)
        {
            global $worker;
            // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
            $data = json_decode($buffer, true);
            $uid = $data['uid'];
            $url=$data['url'];
            // 通過workerman,向uid的頁面推送數(shù)據(jù)
            $ret = sendMessageByUid($uid, $url);
           
            // 返回推送結(jié)果
            $connection->send($ret ? 'ok' : 'fail');
        };
        $inner_text_worker->listen();
    };
    // 新增加一個屬性,用來保存uid到connection的映射
    $worker->uidConnections = array();
    // 當有客戶端發(fā)來消息時執(zhí)行的回調(diào)函數(shù)
    $worker->onMessage = function($connection, $data)use($worker)
    { $connection->lastMessageTime = time();
         $wsData = json_decode($data,true);
        // 判斷當前客戶端是否已經(jīng)驗證,既是否設(shè)置了uid
        if(!isset($connection->uid))
        {
           // 沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證)
           $connection->uid=$wsData['uid'];
           echo $wsData['uid']."shangxianle";
           // $connection->uid = $data;
           /* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,
            * 實現(xiàn)針對特定uid推送數(shù)據(jù)
            */
           $worker->uidConnections[$connection->uid] = $connection;
           return;
        }
    };
    
    // 當有客戶端連接斷開時
    $worker->onClose = function($connection)use($worker)
    {
        global $worker;
        if(isset($connection->uid))
        {
            // 連接斷開時刪除映射
            unset($worker->uidConnections[$connection->uid]);
        }
    };

    // 向所有驗證的用戶推送數(shù)據(jù)
    function broadcast($message)
    {
       global $worker;
       foreach($worker->uidConnections as $connection)
       {
            $connection->send($message);
       }
    }
    
    // 針對uid推送數(shù)據(jù)
    function sendMessageByUid($uid, $message)
    { 
       echo $uid."----".$message;
        global $worker;
        if(isset($worker->uidConnections[$uid]))
        {
            $connection = $worker->uidConnections[$uid];
            $connection->send($message);
            return true;
        }
        
        return false;
    }
   
    // 運行所有的worker(其實當前只定義了一個)
    Worker::runAll();

發(fā)送消息時
model

<?php
namespace app\index\model;
use think\Model;
use think\Session;
/**
 *發(fā)送推送消息模型
 */
class Message extends Model {
/**
 * [SendMessage 發(fā)送推送消息]
 * @param [string] $url [需要推送的語音文件路徑]
 * @param [string] $uid [需要推送給的用戶id]
 * @return [status] [<成功:ok,失敗:fail>]
 */

     public function SendMessage($url,$uid){
        // 建立socket連接到內(nèi)部推送端口
    $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
    // 推送的數(shù)據(jù),包含uid字段,表示是給這個uid推送
    $data = array('uid'=>$uid,'url'=>$url);
    // 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
    $info=fwrite($client, json_encode($data)."\n");
    // 讀取推送結(jié)果
    return fread($client, 8192);
     }
}

前臺連接時

<script type="text/javascript">
                ws = new WebSocket("ws://pay.1d16.com:1234");
ws.onopen = function() {
    var authid="{$authid}";
    var data1={
"option":'login',
"uid":authid
};
ws.send(JSON.stringify(data1)); 
 window.setInterval(function(){
       ws.send('heart');
    },5000);
};
ws.onmessage = function(e) {
    var data=JSON.parse(e.data);
$("#audio").attr("src",data.voice);
var html='<a href="/index/user/receivedetail/id/'+data.id+'.html"><li class=" col-md-12">';
if(data.paymethod=="微信"){
    html+='<img src="/pay/img/wx.png" >';
}else if(data.paymethod=="支付寶"){
    html+='<img src="/pay/img/zfb.png" >';
}
html+='<div class="paylist-txt"><p>'+data.ordernum+'</p><p>'+data.addtime+'<span>支付成功</span></p></div><p class="paylist-price">'+data.money+'元</p></li></a>';
$(".paylist-title").after(html);

};
            </script>

給前臺發(fā)送消息

    $voice= new Voice();
$v=$voice->getVoice("支付寶到賬".$result['total_amount']."元",$out_trade_no);
$message= new Message();
 $ord['voice']=$v;
   $m=$message->SendMessage(json_encode($ord),$ord['receiveid']);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容