workerman

好久之前写的功能 发现都忘了 记录一下

<?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');
    // 这里进程数必须设置为1
    $worker->count = 1;
    // worker进程启动后建立一个内部通讯端口
    $worker->onWorkerStart = function($worker)
    {
        // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
        $inner_text_worker = new Worker('Text://0.0.0.0:5678');
        $inner_text_worker->onMessage = function($connection, $buffer)
        {
            global $worker;
            // $data数组格式,里面有uid,表示向那个uid的页面推送数据
            $data = json_decode($buffer, true);
            $uid = $data['uid'];
            $url=$data['url'];
            // 通过workerman,向uid的页面推送数据
            $ret = sendMessageByUid($uid, $url);
           
            // 返回推送结果
            $connection->send($ret ? 'ok' : 'fail');
        };
        $inner_text_worker->listen();
    };
    // 新增加一个属性,用来保存uid到connection的映射
    $worker->uidConnections = array();
    // 当有客户端发来消息时执行的回调函数
    $worker->onMessage = function($connection, $data)use($worker)
    { $connection->lastMessageTime = time();
         $wsData = json_decode($data,true);
        // 判断当前客户端是否已经验证,既是否设置了uid
        if(!isset($connection->uid))
        {
           // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
           $connection->uid=$wsData['uid'];
           echo $wsData['uid']."shangxianle";
           // $connection->uid = $data;
           /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
            * 实现针对特定uid推送数据
            */
           $worker->uidConnections[$connection->uid] = $connection;
           return;
        }
    };
    
    // 当有客户端连接断开时
    $worker->onClose = function($connection)use($worker)
    {
        global $worker;
        if(isset($connection->uid))
        {
            // 连接断开时删除映射
            unset($worker->uidConnections[$connection->uid]);
        }
    };

    // 向所有验证的用户推送数据
    function broadcast($message)
    {
       global $worker;
       foreach($worker->uidConnections as $connection)
       {
            $connection->send($message);
       }
    }
    
    // 针对uid推送数据
    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();

发送消息时
model

<?php
namespace app\index\model;
use think\Model;
use think\Session;
/**
 *发送推送消息模型
 */
class Message extends Model {
/**
 * [SendMessage 发送推送消息]
 * @param [string] $url [需要推送的语音文件路径]
 * @param [string] $uid [需要推送给的用户id]
 * @return [status] [<成功:ok,失败:fail>]
 */

     public function SendMessage($url,$uid){
        // 建立socket连接到内部推送端口
    $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
    // 推送的数据,包含uid字段,表示是给这个uid推送
    $data = array('uid'=>$uid,'url'=>$url);
    // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
    $info=fwrite($client, json_encode($data)."\n");
    // 读取推送结果
    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>

给前台发送消息

    $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']);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352