我做的是app聊天,
app調(diào)用的時(shí)候,根據(jù)當(dāng)前會(huì)員的mid注冊(cè)的
Gateway::bindUid($client_id, $msg);
app掛起的掛起的時(shí)候(切換到桌面,或者關(guān)閉屏幕) 當(dāng)前鏈接需要關(guān)閉
我在app里面調(diào)用的是ws.close()
對(duì)應(yīng)到Events.php里面的
public static function onClose($client_id) {
// 向所有人發(fā)送
//GateWay::sendToAll("$client_id logout");
if($_SERVER==10002)
{
Gateway::closeClient($client_id);
echo "client_id:{$client_id}\n";
}
}
現(xiàn)在的問題是我每次進(jìn)入掛起在回復(fù) 發(fā)現(xiàn) Gateway::getClientIdByUid($msg) 數(shù)組就多一個(gè)值, 能不能把uid這個(gè)組整體注銷呢??
多一個(gè)說明之前的連接沒關(guān)閉,或者說服務(wù)端沒收到客戶端發(fā)送的關(guān)閉連接的fin包。
可能是ws.close沒運(yùn)行,或者運(yùn)行了沒起作用(沒發(fā)送fin包給服務(wù)端)。
服務(wù)端沒收到fin包,就不會(huì)調(diào)用onClose,就不會(huì)把對(duì)應(yīng)client_id從uid解綁。
上面只是猜測,建議每一步(ws.close onConnet onClose等)都打日志看看確定原因,服務(wù)端也抓包看看客戶端是否發(fā)了fin包過來。抓包方法workerman手冊(cè)有。另外去看下gatewayWorker手冊(cè)心跳部分。