使用的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一直显示待处理
Centos7,Workerman版本4.0.4
请问这个问题是出在哪里?
业务逻辑都去掉试下有没有问题,没问题的话就是业务代码问题,然后自己一行一行排查
我试过用postman调用,失败的时候返回的搜是fail
我直接把等待的URL地址用浏览器访问返回
{
"code": 1,
"message": "Session ID unknown"
}
显示 Session ID unknown 是正常的
那这个怎么办呢
业务逻辑都去掉试下有没有问题,没问题的话就是业务代码问题,然后自己一行一行排查