手冊(cè)上說“客戶端定時(shí)每X秒(推薦小于60秒)向服務(wù)端發(fā)送特定數(shù)據(jù),服務(wù)端設(shè)定為X秒沒有收到客戶端心跳則認(rèn)為客戶端掉線,并關(guān)閉連接觸發(fā)onClose回調(diào)。” 而之所以推薦小于60秒是因?yàn)椤昂芏嗦酚晒?jié)點(diǎn)會(huì)清理60秒內(nèi)不活躍的連接,導(dǎo)致還沒來得及發(fā)送心跳,連接就斷開了?!眳⒖甲詗alker大大在https://wenda.workerman.net/question/4615 這個(gè)問題中的回復(fù)。
問題一:現(xiàn)在我設(shè)置的$gateway->pingInterval=60;$gateway->pingNotResponseLimit = 2;即客戶端連接 pingInterval*pingNotResponseLimit=120 秒內(nèi)沒有任何請(qǐng)求則服務(wù)端認(rèn)為對(duì)應(yīng)客戶端已經(jīng)掉線,服務(wù)端關(guān)閉連接并觸發(fā)onClose回調(diào)。此時(shí)其時(shí)長(zhǎng)已經(jīng)大于60秒,是不是就沒有意義了?我的客戶端大概40秒左右會(huì)發(fā)一次心跳,我是不是應(yīng)該設(shè)置成$gateway->pingInterval=40;$gateway->pingNotResponseLimit = 1才最合適?
問題二:如果是由于路由節(jié)點(diǎn)清理而斷開的連接是否還能正確調(diào)用onclose($client_id)函數(shù)處理業(yè)務(wù)?
問題1:$gateway->pingInterval=60;$gateway->pingNotResponseLimit = 2;
最壞的情況連接斷開120秒后服務(wù)端才檢測(cè)到,是否有意義看你是否有依賴onClose的業(yè)務(wù)以及120秒延遲能否接受。前端心跳40秒,服務(wù)端建議設(shè)置成$gateway->pingInterval=50;$gateway->pingNotResponseLimit = 1;
。$gateway->pingInterval=50;
設(shè)置的比40稍大一些,避免網(wǎng)絡(luò)延遲造成誤判。
問題2: 這種情況一般會(huì)有延遲,一般是心跳檢測(cè)的時(shí)候才能觸發(fā)
我需要在onClose里面更新我的設(shè)備狀態(tài),現(xiàn)在發(fā)現(xiàn)有部分設(shè)備已經(jīng)斷電但是狀態(tài)一直沒有更新,通過打印數(shù)據(jù)發(fā)現(xiàn)有兩種可能。可能一:設(shè)備斷電后觸發(fā)了onClose,但是數(shù)據(jù)庫(kù)更新失敗,導(dǎo)致設(shè)備狀態(tài)沒有更新;可能二:設(shè)備斷電后未觸發(fā)onClose。
按照您對(duì)問題一的回復(fù),雖然我需要在onClose中更新設(shè)備,但如果我對(duì)實(shí)時(shí)性要求不是很高的話,目前這個(gè)設(shè)置也可以接受是嗎?
對(duì)于問題二,您的意思是最終還是可以觸發(fā)心跳是嗎?因?yàn)槲以趏nClose里面打印未獲取到$_SESSION值的client_id時(shí),并沒有發(fā)現(xiàn)那些已經(jīng)斷電但是狀態(tài)并未更新的設(shè)備的client_id,而這些設(shè)備登錄時(shí)client_id是存在的