使用GatewayClient调用getAllClientSessions获取不到任何数据

詹少

使用GatewayClient获取所有在线客户端(getAllClientSessions)的时候,返回的总是空数据(GatewayClient跟worker不在同一个服务器,使用了Gateway::$registerAddress设置公网ip,并且是可以连通的),看了下代码,发现getAllGatewayAddressesFromRegister这个函数里面返回的地址全部都是"127.0.0.1:端口"这样的地址,也就是里面有这么一段代码:

$client = stream_socket_client('tcp://' . self::$registerAddress, $errno, $errmsg, self::$connectTimeout);
if (!$client) {
    throw new Exception('Can not connect to tcp://' . self::$registerAddress . ' ' . $errmsg);
}
fwrite($client, '{"event":"worker_connect","secret_key":"' . self::$secretKey . '"}' . "\n");
stream_set_timeout($client, 1);
$ret = fgets($client, 655350);

这个返回的是{"event":"broadcast_addresses","addresses":}这种,那我就测试了下,在GatewayClient本机上面启动另外一个worker,发现getAllClientSessions取到的竟然是本机的socket客户端,也就是说Gateway::$registerAddress不管设置了172.0.0.1还是设置的公网服务器ip,getAllClientSessions返回的都是本机上面的worker客户端信息

问题总结:Gateway::$registerAddress设置公网服务器的情况下,getAllClientSessions函数获取到的是当前服务器的客户端信息,无法获取目标ip的worker服务器的客户端信息。

3304 1 0
1个回答

walkor

如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。

摘自手册 http://doc2.workerman.net/326149

  • 詹少 2018-05-02

    啊!!!!registerAddress和lanIp搞混了

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