你好,現(xiàn)在做的項(xiàng)目使用上了GatewayWorker框架,與客戶端(網(wǎng)頁(yè),pad,windows客戶端)做消息通訊,現(xiàn)在遇到一個(gè)問(wèn)題是保活相關(guān)的。C++或者Java那邊使用的第三方庫(kù),自帶?;顧C(jī)制,會(huì)定時(shí)給服務(wù)端發(fā)ping消息來(lái)檢測(cè)檢測(cè)是否保持連接狀態(tài),但是抓包的結(jié)果顯示opcode碼為0x09,服務(wù)端在onmessage監(jiān)聽(tīng)不到消息,導(dǎo)致我們服務(wù)端的一段時(shí)間過(guò)后就斷開(kāi)連接,保活失敗,請(qǐng)問(wèn)有沒(méi)有辦法監(jiān)聽(tīng)或者兼容該情況?
$gateway = new Gateway("websocket://0.0.0.0:8384");
// gateway名稱,status方便查看
$gateway->name = 'YourAppGatewayWS';
// gateway進(jìn)程數(shù)
$gateway->count = 4;
// 本機(jī)ip,分布式部署時(shí)使用內(nèi)網(wǎng)ip
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會(huì)使用4000 4001 4002 4003 4個(gè)端口作為內(nèi)部通訊端口
$gateway->startPort = 4000;
// 服務(wù)注冊(cè)地址
$gateway->registerAddress = '127.0.0.1:1237';
// 心跳間隔
$gateway->pingInterval = 10;
// 心跳數(shù)據(jù)
//$gateway->pingData = '{"type":"ping"}';
$gateway->pingData = '';
$gateway->pingNotResponseLimit = 2;
目前為了兼容這種情況是讓客戶端發(fā)送text消息來(lái)做?;睿?qǐng)問(wèn)有沒(méi)有其他的方法呢?
Workerman Websocket協(xié)議類會(huì)在客戶端發(fā)送ping后自動(dòng)返回pong。
代碼在
https://github.com/walkor/Workerman/blob/master/Protocols/Websocket.php#L116
嗯,這塊代碼有看到過(guò),但是文檔上建議的心跳檢測(cè)配置客戶端?;畹姆椒ㄊ强蛻舳嗽偌觽€(gè)文本消息定時(shí)發(fā)送給服務(wù)端,這樣服務(wù)端才能檢測(cè)到客戶端的存在,有沒(méi)有辦法直接識(shí)別客戶端的0x09的opcode消息來(lái)實(shí)現(xiàn)心跳檢測(cè)?不知道我有沒(méi)有理解錯(cuò)誤,請(qǐng)指教!
start_gateway.php里加一句
$gateway->onWebSocketPing = function($connection) {
$connection->pingNotResponseCount = -1;
};
試下
$gateway->onWebSocketPing = function($connection) {
$connection->pingNotResponseCount = -1;
$connection->send('pong');
};