在線統(tǒng)計(jì)用戶就100多個(gè)人,但連接卻有1300多個(gè),連接不是自動(dòng)銷毀的么,如果客戶端非正常斷開鏈接會(huì)殘留的么。是不是要加心跳。socket-io的心跳要怎么加。。。
長連接必須加心跳的呀。
至于怎么加,實(shí)現(xiàn)方式有很多的。
比如服務(wù)端 on connection 的時(shí)候設(shè)置一個(gè)定時(shí)器,每 30 秒查詢上次心跳時(shí)間,如果超過一定時(shí)間,則判定用戶已離線,將其 disconnect。
而客戶端 on connect 的時(shí)候也設(shè)置一個(gè)定時(shí)器,每 29 秒發(fā)送一個(gè)心跳指令。服務(wù)端收到之后更新心跳時(shí)間。
既然你是游戲服務(wù)器,那么應(yīng)該涉及到時(shí)間誤差校準(zhǔn)吧?我的項(xiàng)目中就是把時(shí)間校準(zhǔn)當(dāng)成心跳用
sockeio 在客戶端連接的過程中,一般會(huì)發(fā)起好幾個(gè)網(wǎng)絡(luò)連接(HTTP 請(qǐng)求),最終會(huì)得到并保持一個(gè) WebSocket 長連接,這個(gè)長連接是有 ping 的,所以應(yīng)該不存在殘留的問題。
$io->worker->connections 并不嚴(yán)格對(duì)應(yīng)每個(gè)客戶端,如果你的客戶端頻繁重連 socketio 的話,產(chǎn)生的網(wǎng)絡(luò)連接數(shù)是會(huì)多一些的。不過你這個(gè)也多太多了……
你可以試試 count($io->of('/')->sockets) 看看結(jié)果如何,這個(gè)應(yīng)該更接近真實(shí)的在線客戶數(shù)。