我建立了4個(gè)worker進(jìn)程,在設(shè)備連接后,會開啟一個(gè)20秒的任務(wù)。因?yàn)樵O(shè)備信號的問題,有時(shí)設(shè)備會斷開后又重連,這時(shí)候會與服務(wù)器建立新的連接。在新的連接中,我會判斷設(shè)備是否時(shí)這種斷了又連的情況,如果是這種情況我會用Gateway::closeClient($old_client_id);
關(guān)閉老連接,在onclose 事件中 去刪除 在老連接開啟的20秒任務(wù)?,F(xiàn)在又兩問題:
1:有時(shí)20秒任務(wù) 突然不運(yùn)行了。這個(gè)時(shí)根據(jù)設(shè)備端發(fā)送的心跳信息判斷的,正常在20秒任務(wù)中,我會與設(shè)備通訊一次。因此設(shè)備是不會發(fā)送心跳信號的,如果60秒設(shè)備與服務(wù)器之前沒有通訊就會發(fā)送心跳。因此服務(wù)端接收到心跳時(shí),我只有重新開始一個(gè)20秒任務(wù),來解決這個(gè)Timer失效的問題;
2:在onclose 刪除定時(shí)器時(shí),有時(shí)候覺得好像沒有刪除掉,因?yàn)閷τ诘倪壿嬤€在運(yùn)行,還在向數(shù)據(jù)庫寫數(shù)據(jù)。是否時(shí)因?yàn)殚_啟了多個(gè)進(jìn)程的原因,執(zhí)行刪除定時(shí)器所在進(jìn)程和創(chuàng)建定時(shí)器所在進(jìn)程不一致,因此通過Timer.del(?),這個(gè)?對于的定時(shí)器不存在呢?
3:我如何知道到底當(dāng)前不同的worker進(jìn)程中有哪些定時(shí)器任務(wù)在執(zhí)行呢?
請指點(diǎn)下,謝謝!
利用心跳可以關(guān)閉老的無用連接。
設(shè)置
$gateway->pingInterval = 55;
$gateway->pingNotResponseLimit = 1;
這樣55秒內(nèi)沒有發(fā)心跳的設(shè)備的連接會自動close,不用手動調(diào)用closeClient()