使用的WorkerMan中phpsocket-io,总出现收不到数据问题

苑镇

问题描述

使用的WorkerMan中phpsocket-io,总出现收不到数据问题

程序代码或配置

// 全局数组保存uid在线数据
$uidConnectionMap_CRT_pc = array();

// PHPSocketIO服务
$sender_io_CRT_pc = new SocketIO(22120,$context);

// 客户端发起连接事件时,设置连接socket的各种事件回调
$sender_io_CRT_pc->on('connection', function($socket)use($sender_io_CRT_pc)
{
    //echo "new connection coming\n";

    // 当客户端发来登录事件时触发
    $socket->on('login', function ($uid)use($socket)
    {
        global $uidConnectionMap_CRT_pc;
        // 已经登录过了
        if(isset($socket->uid))
        {
            return;
        }

        // 更新对应uid的在线数据
        $uid = (string)$uid;
        if(!isset($uidConnectionMap_CRT_pc[$uid]))
        {
            $uidConnectionMap_CRT_pc[$uid] = 0;
        }
        // 这个uid有++$uidConnectionMap_CRT_pc[$uid]个socket连接
        ++$uidConnectionMap_CRT_pc[$uid];
        // 将这个连接加入到uid分组,方便针对uid推送数据
        $socket->join($uid);
        $socket->uid = $uid;
    });

    // 当客户端断开连接是触发(一般是关闭网页或者跳转刷新导致)
    $socket->on('disconnect', function () use($socket)
    {
        if(!isset($socket->uid))
        {
            return;
        }

        global $uidConnectionMap_CRT_pc, $sender_io_CRT_pc;

        // 将uid的在线socket数减一
        if(--$uidConnectionMap_CRT_pc[$socket->uid] <= 0)
        {
            unset($uidConnectionMap_CRT_pc[$socket->uid]);
        }
    });
});

// 当$sender_io_CRT_pc启动后监听一个http端口,通过这个端口可以给任意uid或者所有uid推送数据
$sender_io_CRT_pc->on('workerStart', function()
{
    // 监听一个http端口
    $inner_http_worker_CRT = new Worker('http://172.16.137.103:22121');

    // 当http客户端发来数据时触发
    $inner_http_worker_CRT->onMessage = function(TcpConnection $inner_http_worker_CRT_pc_pc, Request $request)
    {
        global $uidConnectionMap_CRT_pc;
        $post = $request->post();
        $post = $post ? $post : $request->get();

        // 推送数据的url格式 type=publish&to=uid&content=xxxx
        switch(@$post['type'])
        {
            case 'fire'://设备报警用
                global $sender_io_CRT_pc;
                $to = @$post['to'];

                // 有指定uid则向uid所在socket组发送数据
                if($to)
                {
                    $sender_io_CRT_pc->to($to)->emit('new_msg', $post['content']);
                }
                else
                {//否则向所有uid推送数据
                    $sender_io_CRT_pc->emit('new_msg', @$post['content']);
                }
                break;
            case 'video'://视频弹窗用
                global $sender_io_CRT_pc;
                $to = @$post['to'];

                // 有指定uid则向uid所在socket组发送数据
                if($to)
                {
                    $sender_io_CRT_pc->to($to)->emit('video_msg', $post['content']);
                }
                else
                {//否则向所有uid推送数据
                    $sender_io_CRT_pc->emit('video_msg', @$post['content']);
                }
                break;
            case 'device'://设备在线离线状态
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('device', $post['content']);
                break;
            case 'mail'://站内信
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('mail', @$post['content']);
                break;
            case "videoPay"://摄像头充值结果推送
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('videoPay', @$post['content']);
                break;
            case "wechat"://充值结果推送
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('wechat', @$post['content']);
                break;
            case "firereview"://消警复核数量推送
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('firereview', @$post['content']);
                break;
            case "wechatLogin"://微信扫码登录结果
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('wechatLogin', @$post['content']);
                break;
            case "sendtoMaster"://处理报警推送消息给总管理
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('sendtoMaster', @$post['content']);
                break;
            case "companystatus"://强制全部员工下线并禁止登录
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('companystatus', @$post['content']);
                break;
            case "sim"://SIM到期提醒
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('sim', @$post['content']);
                break;
            case "sim_warning"://SIM流量预警提醒
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('sim_warning', @$post['content']);
                break;
            case "host920"://920推送子设备状态
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('host920', @$post['content']);
                break;
            case "host920More"://920推送总线盘
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('host920More', @$post['content']);
                break;
            case "control602"://602推送设备状态
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('control602', @$post['content']);
                break;
            case "control656"://656推送设备状态
                global $sender_io_CRT_pc;
                $to = @$post['to'];
                $sender_io_CRT_pc->to($to)->emit('control656', @$post['content']);
                break;
        }
        return $inner_http_worker_CRT_pc_pc->send('fail');
    };
    // 执行监听
    $inner_http_worker_CRT->listen();
});

重现问题的步骤

收不到推送数据的时候,socket一直显示待处理
截图

操作系统环境及workerman/webman等具体版本

Centos7,Workerman版本4.0.4
截图

请问这个问题是出在哪里?

108 1 0
1个回答

walkor 打赏

业务逻辑都去掉试下有没有问题,没问题的话就是业务代码问题,然后自己一行一行排查

  • 苑镇 12天前

    我试过用postman调用,失败的时候返回的搜是fail

  • 苑镇 12天前

    我直接把等待的URL地址用浏览器访问返回
    {
    "code": 1,
    "message": "Session ID unknown"
    }

  • walkor 12天前

    显示 Session ID unknown 是正常的

  • 苑镇 12天前

    那这个怎么办呢

  • walkor 12天前

    业务逻辑都去掉试下有没有问题,没问题的话就是业务代码问题,然后自己一行一行排查

×
🔝