想請(qǐng)教一個(gè)問題,當(dāng)我的設(shè)備在連上gateway后突然斷開,是否可以通過$SESSION來獲取這臺(tái)設(shè)備id并更新對(duì)應(yīng)的設(shè)備狀態(tài),因?yàn)槲椰F(xiàn)在遇到的情況是我的設(shè)備斷開了連接,觸發(fā)了onclose但是$SESSION卻沒有值,導(dǎo)致無法運(yùn)行update函數(shù)更新設(shè)備狀態(tài)。手冊(cè)上說客戶端或服務(wù)端與Gateway進(jìn)程的連接斷開時(shí)觸發(fā)onclose,而$_SESSION的生命周期與client_id對(duì)應(yīng)socket連接的生命周期相同,當(dāng)客戶端連接斷開后,對(duì)應(yīng)的客戶端$_SESSION將會(huì)清除。我是否可以理解為設(shè)備或服務(wù)器和gateway斷開連接并不等同于設(shè)備斷開socket連接,只有觸發(fā)onclose才算斷開socket連接?如果是如此,那為何我的onclose中session取不到值?是我的程序問題嗎?還請(qǐng)大神賜教,以下是我的gateway程序邏輯(PS:并不是我的所有設(shè)備都出現(xiàn)這個(gè)問題)
public static function onMessage($client_id, $message)
{
$message = json_decode($message, true);
//獲取設(shè)備編號(hào)并存入session
$_SESSION=$uid;
}
public static function onClose($client_id)
{
$SESSION=$_SESSION;
if($SESSION)
{
update($SESSION)//執(zhí)行函數(shù)更新數(shù)據(jù)庫中設(shè)備的狀態(tài)
}
}
1、設(shè)備或服務(wù)器和gateway斷開連接即代表設(shè)備或服務(wù)器斷開了對(duì)應(yīng)的socket連接,此時(shí)會(huì)觸發(fā) onClose 回調(diào);
2、onClose中可以獲取到 $_SESSION的值啊, 示例代碼中的 $uid 哪來的?? 這個(gè)“游離”變量也會(huì)導(dǎo)致 $_SESSION 邏輯為空。
已知有2種原因會(huì)導(dǎo)致這個(gè)問題
1、客戶端發(fā)起連接后沒有發(fā)送數(shù)據(jù)連接就斷開,也就是onMessage沒有觸發(fā)過
2、觸發(fā)了onMessage但沒走到$_SESSION賦值的業(yè)務(wù)代碼
?
關(guān)于第1種很常見,設(shè)備發(fā)起連接后還沒來得及發(fā)送數(shù)據(jù)連接已經(jīng)斷開。還有外網(wǎng)環(huán)境一些網(wǎng)絡(luò)掃描工具掃描端口,負(fù)載均衡端口存活探測(cè)等都會(huì)產(chǎn)生建立連接但是不發(fā)送數(shù)據(jù)的情況。
所以如果onClose里去獲得onMessage里的$_SESSION,onClose里必須要用isset判斷下再使用。
?
關(guān)于第2種需要自行記錄日志,在設(shè)置$_SESSION的時(shí)候記錄下日志包括client_id,session的內(nèi)容。然后在onClose里記錄client_id,獲取的session內(nèi)容??聪耾nClose里獲得不到session的時(shí)候是否有這個(gè)client_id設(shè)置session的日志