大佬,GatewayWorker和GatewayClient在百度云的不同服务器,通过内网IP连接,每次打开页面都要等5秒左右的时间,就算一个客户端都没有,也是要等很久,有可能是什么原因呢?
在GatewayClient服务器上ping GatewayWorker服务器 速度少于1ms
如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。注意,无论何时lanIp都不能写成0.0.0.0,否则将无法通讯。 如果GatewayClient和GatewayWorker不是在同一台服务器上,还要设置防火墙(云服务器的话还要设置安全组)让以下端口可以被GatewayClient所在服务器访问: 1、start_gateway.php中的$gateway->startPort起始的几个端口(要开放的端口个数和$gateway->count有关)。 2、start_register.php中的Register服务端口 反之如果GatewayClient和GatewayWorker在同一台服务器上运行,则不用做任何更改,直接按照示例使用GatewayClient即可。
摘自手册 http://doc2.workerman.net/push-in-other-project.html
start_gateway.php:
// gateway 进程,这里使用Text协议,可以用telnet测试 $gateway = new Gateway("tcp://0.0.0.0:8282"); // gateway名称,status方便查看 $gateway->name = 'YourAppGateway'; // gateway进程数 $gateway->count = 4; // 本机ip,分布式部署时使用内网ip $gateway->lanIp = '172.16.0.5'; // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000 // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 $gateway->startPort = 2900; // 服务注册地址 $gateway->registerAddress = '127.0.0.1:1238';
start_register.php: use \Workerman\Worker; use \GatewayWorker\Register;
// 自动加载类 require_once __DIR__ . '/../../vendor/autoload.php';
// register 必须是text协议 $register = new Register('text://0.0.0.0:1238');
// 如果不是在根目录启动,则运行runAll方法 if(!defined('GLOBAL_START')) { Worker::runAll(); }
GatewayClient的业务页面用了查询客户端是否在线:
Gateway::bindUid($client_id, $macaddress); if( !Gateway::isUidOnline($macaddress) ){ $online = '<span class="offline">不在线</span>'; }else{ $online = '<span class="online">在线</span>'; }
GatewayClient的业务页面每次打开都load比较久才能看到客户端的在线情况,而且曾经登陆过客户端数量越多,load的时间也越久,目前5个客户端登陆过,等大概6s,如果以后几百上千,那不是完蛋了。
原来是Gateway::bindUid()这句出现问题,去掉这句绑定Uid,直接用Gateway::isOnline()查询,马上就快了,绑定Uid为什么会这么耗时呢?
我贴的第1点防火墙安全组那里看下做了没?你的配置对应的端口应该是2900 2901 2902 2903,请检查下。 手册上的注意事项请务必确认检查,这样你会很省时间
其实都有的,因为是在测试阶段,防火墙关闭,安全组是全放开的,但就是绑定Uid特别耗时,我是在同一个页面绑定多个Uid,然后查询一个个Uid的在线状态的
后来不用绑定Uid,直接通过clientid查询在线状态,马上就快了
进入到bindUid函数里找下看下那行代码执行的慢
@1:今天调试了下,发现原来是isUidOnline($uid);这句慢,getBufferFromAllGateway($gateway_data);因为调用了这个function。
今天调试了一下,发现在GatewayClient的Gateway.php里面,耗时的是isUidOnline($uid);这句, isUidOnline($uid);调用getClientIdByUid($uid); getClientIdByUid($uid);调用getBufferFromAllGateway($gateway_data); 来到getBufferFromAllGateway($gateway_data);就很慢了,基本上查询一个Uid差不多1秒钟,查询n个就是n秒钟。 getBufferFromAllGateway($gateway_data);这个function,好复杂,就没继续看下去了。
[attach]1471[/attach]
看下register的1238端口安全组和防火墙开了没。 在gatewayClient上 telnet ip 1238 看下能否连上
在gatewayClient上 telnet ip 1238 可以连上
[attach]1472[/attach]
如果GatewayClient和GatewayWorker不是在同一台服务器上,则需要先将start_gateway.php中的lanIp改成当前服务器的内网ip(如果不在一个内网可改成公网ip)。注意,无论何时lanIp都不能写成0.0.0.0,否则将无法通讯。
如果GatewayClient和GatewayWorker不是在同一台服务器上,还要设置防火墙(云服务器的话还要设置安全组)让以下端口可以被GatewayClient所在服务器访问:
1、start_gateway.php中的$gateway->startPort起始的几个端口(要开放的端口个数和$gateway->count有关)。
2、start_register.php中的Register服务端口 反之如果GatewayClient和GatewayWorker在同一台服务器上运行,则不用做任何更改,直接按照示例使用GatewayClient即可。
摘自手册 http://doc2.workerman.net/push-in-other-project.html
start_gateway.php:
// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("tcp://0.0.0.0:8282");
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '172.16.0.5';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';
start_register.php:
use \Workerman\Worker;
use \GatewayWorker\Register;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
// register 必须是text协议
$register = new Register('text://0.0.0.0:1238');
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
GatewayClient的业务页面用了查询客户端是否在线:
Gateway::bindUid($client_id, $macaddress);
if( !Gateway::isUidOnline($macaddress) ){
$online = '<span class="offline">不在线</span>';
}else{
$online = '<span class="online">在线</span>';
}
GatewayClient的业务页面每次打开都load比较久才能看到客户端的在线情况,而且曾经登陆过客户端数量越多,load的时间也越久,目前5个客户端登陆过,等大概6s,如果以后几百上千,那不是完蛋了。
原来是Gateway::bindUid()这句出现问题,去掉这句绑定Uid,直接用Gateway::isOnline()查询,马上就快了,绑定Uid为什么会这么耗时呢?
我贴的第1点防火墙安全组那里看下做了没?你的配置对应的端口应该是2900 2901 2902 2903,请检查下。
手册上的注意事项请务必确认检查,这样你会很省时间
其实都有的,因为是在测试阶段,防火墙关闭,安全组是全放开的,但就是绑定Uid特别耗时,我是在同一个页面绑定多个Uid,然后查询一个个Uid的在线状态的
后来不用绑定Uid,直接通过clientid查询在线状态,马上就快了
进入到bindUid函数里找下看下那行代码执行的慢
@1:今天调试了下,发现原来是isUidOnline($uid);这句慢,getBufferFromAllGateway($gateway_data);因为调用了这个function。
今天调试了一下,发现在GatewayClient的Gateway.php里面,耗时的是isUidOnline($uid);这句,
isUidOnline($uid);调用getClientIdByUid($uid);
getClientIdByUid($uid);调用getBufferFromAllGateway($gateway_data);
来到getBufferFromAllGateway($gateway_data);就很慢了,基本上查询一个Uid差不多1秒钟,查询n个就是n秒钟。
getBufferFromAllGateway($gateway_data);这个function,好复杂,就没继续看下去了。
[attach]1471[/attach]
看下register的1238端口安全组和防火墙开了没。
在gatewayClient上 telnet ip 1238 看下能否连上
在gatewayClient上 telnet ip 1238 可以连上
[attach]1472[/attach]