• WorkerMan中php后端及时推送消息给客户端


    php后端及时推送消息给客户端

    原理:

    1、建立一个websocket Worker,用来维持客户端长连接

    2、websocket Worker内部建立一个text Worker

    3、websocket Worker 与 text Worker是同一个进程,可以方便的共享客户端连接

    4、某个独立的php后台系统通过text协议与text Worker通讯

    5、text Worker操作websocket连接完成数据推送

    代码及步骤

    push.php
    
      
    
    <?php
    
    use WorkermanWorker;
    
    require_once './Workerman/Autoloader.php';
    
    // 初始化一个worker容器,监听1234端口
    
    $worker = new Worker('websocket://0.0.0.0:1234');//
    
      
    
    /*
    
     * 注意这里进程数必须设置为1,否则会报端口占用错误
    
     * (php 7可以设置进程数大于1,前提是$inner_text_worker->reusePort=true)
    
     */
    
    $worker->count = 1;
    
    // worker进程启动后创建一个text Worker以便打开一个内部通讯端口
    
    $worker->onWorkerStart = function($worker)
    
    {
    
        // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    
        $inner_text_worker = new Worker('text://0.0.0.0:5678');
    
        $inner_text_worker->onMessage = function($connection, $buffer)
    
        {
    
            // $data数组格式,里面有uid,表示向那个uid的页面推送数据
    
            $data = json_decode($buffer, true);
    
            $uid = $data['uid'];
    
            // 通过workerman,向uid的页面推送数据
    
            $ret = sendMessageByUid($uid, $buffer);
    
            // 返回推送结果
    
            $connection->send($ret ? 'ok' : 'fail');
    
        };
    
        // ## 执行监听 ##
    
        $inner_text_worker->listen();
    
    };
    
    // 新增加一个属性,用来保存uid到connection的映射
    
    $worker->uidConnections = array();
    
    // 当有客户端发来消息时执行的回调函数
    
    $worker->onMessage = function($connection, $data)
    
    {
    
        global $worker;
    
        // 判断当前客户端是否已经验证,既是否设置了uid
    
        if(!isset($connection->uid))
    
        {
    
           // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
    
           $connection->uid = $data;
    
           /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
    
            * 实现针对特定uid推送数据
    
            */
    
           $worker->uidConnections[$connection->uid] = $connection;
    
           return;
    
        }
    
    };
    
      
    
    // 当有客户端连接断开时
    
    $worker->onClose = function($connection)
    
    {
    
        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)
    
    {
    
        global $worker;
    
        if(isset($worker->uidConnections[$uid]))
    
        {
    
            $connection = $worker->uidConnections[$uid];
    
            $connection->send($message);
    
            return true;
    
        }
    
        return false;
    
    }
    
      
    
    // 运行所有的worker
    
    Worker::runAll();
    
    启动后端服务 php push.php start -d
    
      
    
    前端接收推送的js代码
    
      
    
    var ws = new WebSocket('ws://127.0.0.1:1234');
    
    ws.onopen = function(){
    
        var uid = 'uid1';
    
        ws.send(uid);
    
    };
    
    ws.onmessage = function(e){
    
        alert(e.data);
    
    };
    
    后端推送消息的代码
    
      
    
    // 建立socket连接到内部推送端口
    
    $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
    
    // 推送的数据,包含uid字段,表示是给这个uid推送
    
    $data = array('uid'=>'uid1', 'percent'=>'88%');
    
    // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
    
    fwrite($client, json_encode($data)."
    ");
    
    // 读取推送结果
    
    echo fread($client, 8192);
    

      

    后端推送消息的代码和push.php监听同一个端口

    push.php和前端监听同一个websocket端口

    通过后端推送消息的代码向push.php推送数据,

    push.php接受到数据后通过处理 利用websocket往前端推送数据

    以上就是WorkerMan中php后端及时推送消息给客户端的详细内容

    更多学习内容请访问:

    怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新

  • 相关阅读:
    selenium——上传文件
    selenium——下拉框
    selenium——鼠标操作ActionChains:点击、滑动、拖动
    selenium定位元素—逻辑运算、xpath函数、轴定位
    spring设置webAppRootKey
    树莓3 集群
    redis集群搭建
    MQ基础
    MQ集群测试环境搭建(多节点负载均衡,共享一个kahaDB文件(nas方式))
    weblogic对jms实现的QueueConnection实现与TopicConnection实现问题
  • 原文地址:https://www.cnblogs.com/a609251438/p/12505197.html
Copyright © 2020-2023  润新知