大佬,GatewayWorker和GatewayClient在百度云的不同服務(wù)器,通過內(nèi)網(wǎng)IP連接,每次打開頁面都要等5秒左右的時間,就算一個客戶端都沒有,也是要等很久,有可能是什么原因呢?
在GatewayClient服務(wù)器上ping GatewayWorker服務(wù)器 速度少于1ms
如果GatewayClient和GatewayWorker不是在同一臺服務(wù)器上,則需要先將start_gateway.php中的lanIp改成當(dāng)前服務(wù)器的內(nèi)網(wǎng)ip(如果不在一個內(nèi)網(wǎng)可改成公網(wǎng)ip)。注意,無論何時lanIp都不能寫成0.0.0.0,否則將無法通訊。
如果GatewayClient和GatewayWorker不是在同一臺服務(wù)器上,還要設(shè)置防火墻(云服務(wù)器的話還要設(shè)置安全組)讓以下端口可以被GatewayClient所在服務(wù)器訪問:
1、start_gateway.php中的$gateway->startPort起始的幾個端口(要開放的端口個數(shù)和$gateway->count有關(guān))。
2、start_register.php中的Register服務(wù)端口 反之如果GatewayClient和GatewayWorker在同一臺服務(wù)器上運(yùn)行,則不用做任何更改,直接按照示例使用GatewayClient即可。
start_gateway.php:
// gateway 進(jìn)程,這里使用Text協(xié)議,可以用telnet測試
$gateway = new Gateway("tcp://0.0.0.0:8282");
// gateway名稱,status方便查看
$gateway->name = 'YourAppGateway';
// gateway進(jìn)程數(shù)
$gateway->count = 4;
// 本機(jī)ip,分布式部署時使用內(nèi)網(wǎng)ip
$gateway->lanIp = '172.16.0.5';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會使用4000 4001 4002 4003 4個端口作為內(nèi)部通訊端口
$gateway->startPort = 2900;
// 服務(wù)注冊地址
$gateway->registerAddress = '127.0.0.1:1238';
start_register.php:
use \Workerman\Worker;
use \GatewayWorker\Register;
// 自動加載類
require_once __DIR__ . '/../../vendor/autoload.php';
// register 必須是text協(xié)議
$register = new Register('text://0.0.0.0:1238');
// 如果不是在根目錄啟動,則運(yùn)行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
GatewayClient的業(yè)務(wù)頁面用了查詢客戶端是否在線:
Gateway::bindUid($client_id, $macaddress);
if( !Gateway::isUidOnline($macaddress) ){
$online = '<span class="offline">不在線</span>';
}else{
$online = '<span class="online">在線</span>';
}
GatewayClient的業(yè)務(wù)頁面每次打開都load比較久才能看到客戶端的在線情況,而且曾經(jīng)登陸過客戶端數(shù)量越多,load的時間也越久,目前5個客戶端登陸過,等大概6s,如果以后幾百上千,那不是完蛋了。
原來是Gateway::bindUid()這句出現(xiàn)問題,去掉這句綁定Uid,直接用Gateway::isOnline()查詢,馬上就快了,綁定Uid為什么會這么耗時呢?
今天調(diào)試了一下,發(fā)現(xiàn)在GatewayClient的Gateway.php里面,耗時的是isUidOnline($uid);這句,
isUidOnline($uid);調(diào)用getClientIdByUid($uid);
getClientIdByUid($uid);調(diào)用getBufferFromAllGateway($gateway_data);
來到getBufferFromAllGateway($gateway_data);就很慢了,基本上查詢一個Uid差不多1秒鐘,查詢n個就是n秒鐘。
getBufferFromAllGateway($gateway_data);這個function,好復(fù)雜,就沒繼續(xù)看下去了。
?
[attach]1471[/attach]
?