workerman-chat调用onclose无效

re3wq
case 'login':
                // 判断是否有房间号
                if(!isset($message_data['room_id']))
                {
                    throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
                }

                // 把房间号昵称放到session中
                $room_id = $message_data['room_id'];
                $client_name = htmlspecialchars($message_data['client_name']);
                $_SESSION['room_id'] = $room_id;
                $_SESSION['client_name'] = $client_name;

                // 获取房间内所有用户列表 
                $clients_list = Gateway::getClientSessionsByGroup($room_id);
                foreach($clients_list as $tmp_client_id=>$item)
                {
                    //如果有重名的用户,通知对方退出并删除列表
                    if($item['client_name']==$client_name){
                        self::onClose($tmp_client_id);
                        unset($clients_list[$tmp_client_id]);
                        continue;
                    }
                    $clients_list[$tmp_client_id] = $item['client_name'];
                }
                $clients_list[$client_id] = $client_name;

                // 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx} 
                $new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
                Gateway::sendToGroup($room_id, json_encode($new_message));
                Gateway::joinGroup($client_id, $room_id);

                // 给当前用户发送用户列表 
                $new_message['client_list'] = $clients_list;
                Gateway::sendToCurrentClient(json_encode($new_message));
                return;

self::onClose($tmp_client_id);

调用onClose方法,可以通知对方logout,但是client_id依然存在,对方刷新以后会有多个client_id,造成两方无法聊天,请大神看一下这是怎么回事

1714 1 0
1个回答

walkor

onClose 方法是发生连接关闭事件自动触发的方法,并不是主动关闭连接的接口。使用gatewayWorker请先阅读文档。

  • re3wq 2020-09-28

    大神,主动关闭需要调用什么接口啊,老板只催进度,不管方法。。

  • re3wq 2020-09-28

    Gateway::closeClient($tmp_client_id);
    用了closeClient方法,顺便跟大神说一下workerman-chat聊天室也有这个bug,断线重连的话会生成相同名称的client_id,手机切换网络很短的断线重连时间就会出现这种问题

  • walkor 2020-09-28

    框架有机制,运行过程中不计产生重复的client_id

年代过于久远,无法发表回答
🔝