急,tp5.0怎么使用workerman后端推送消息到前端

qdmdxgg

小白一个,刚刚安装了workerman,前端推送数据没有问题,现在想tp的后端推送消息给指定用户,怎么推送呢?有没有源码参考一下,最好可以是tp的

548 1 0
1个回答

qdmdxgg

是不是要安装channel组件呢,是的话怎么用呢

  • tanhongbin 2023-05-26

    这个官网有呀,就是tp推给workerman 然后workerman websocket推送给前端,这个代码你看看手册啥的很好写呀

  • qdmdxgg 2023-05-26

    就是没找到,不知道哪个是,看了好几次手册了

  • tanhongbin 2023-05-26

    百度应该都有的

  • qdmdxgg 2023-05-26

    worker代码:
    <?php

    namespace app\push\controller;
    use think\worker\Server;

    class Worker extends Server
    {

    protected $socket = 'websocket://0.0.0.0:2346';
    protected $uidConnections = [];
    protected $HEARTBEAT_TIME = '300';//心跳
    
    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        $data = json_decode($data,false);
        //给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间
        $connection->lastMessageTime = time();
    
        switch($data->type){
            case 'login':
                //首次进入
                $this->uidConnections[$data->uid] = $connection;//保存身份
                $this->push_news($data->uid,$data->host);
                break;
            case 'pushNews':
                //消息推送
                $this->push_news($data->uid,$data->host,$data->msg);
                break;
        }
    }
    
    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {
    
    }
    
     /**
     * 当连接断开时触发的回调函数
     * 连接断开销毁连接对象节约内存空间
     * @param $connection
     */
    public function onClose($connection)
    {
      /*  unset($this->uidConnections[$connection->uid]);
       unset($connection); */
    }
    
    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }
    
    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {
        // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
        $inner_text_worker = new \Workerman\Worker('Text://0.0.0.0:6890');
        $inner_text_worker->onMessage = function ($connection, $buffer){
            $buffer = json_decode($buffer,false);
            $res = '';
            if($buffer->type == 'pushNews')
            {
                //$connection->send(json_encode($this->uidConnections));
    
                //消息推送
                $res = $this->push_news($buffer->uid,$buffer->host,$buffer->msg);
            }
            $connection->send($res ? 'ok' : 'fail');
        };
        $inner_text_worker->listen();
    
    }
    
    //消息推送
    public function push_news($uid,$host,$msg='')
    {
        if(isset($this->uidConnections[$uid])){
            // 获取之前用户的链接
            $conn = $this->uidConnections[$uid];
            $conn->send(json_encode(['type'=>'push','num'=>'消息数','msg'=>$msg]));
            return true;
        }
        return false;
    }

    }

  • qdmdxgg 2023-05-26

    php推送:

        $client = stream_socket_client('tcp://127.0.0.1:6890', $errno, $errmsg, 1);
    
        $data = ['type'=>'pushNews','host'=>'host','uid'=>'user-1','msg'=>'消息内容'];
    
        //发送数据,Text协议需要在数据末尾加上换行符
        fwrite($client, json_encode($data)."\n");
        //读取推送结果
        echo fread($client, 8192);
  • qdmdxgg 2023-05-26

    客户端:
    //消息
    ws = new WebSocket("ws://www.demo.com:2346");
    //发送
    ws.onopen = function() {
    ws.send(
    JSON.stringify({
    type: "login",
    host: $('nav .host').html(),
    uid: $('nav .uid').html(),
    })
    );
    };

            //接收
            ws.onmessage = function(e) {
                console.log(e.data);
                return false;
                var json = JSON.parse(e.data);
                if(json.type=='push')
                {
                    //推送消息
                    Toastr.info("消息:"+json.msg);
                }
                if(json.hasOwnProperty('num'))
                {
                    //未读消息
                    $('#numsview').html(json.num>0 ? (json.num>99 ? '99+' : json.num) : '');
                }
            };
  • qdmdxgg 2023-05-26

    帮我看看我这个代码哪里有问题呢?前端结束发送是没问题,就是php后端发的消息内容,接收不到,我这边排查到的问题就是在后端推送的时候获取的$this->uidConnections里面存储的用户是空的

  • Gin 2023-05-26

    不同进程之间的 uidConnections 不共享

  • qdmdxgg 2023-05-27

    这个真找不到问题出在哪里,我换了WEB消息推送框架来推送消息,这个可以没问题

🔝