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