想請(qǐng)教一個(gè)問(wèn)題,當(dāng)我的設(shè)備在連上gateway后突然斷開(kāi),是否可以通過(guò)$SESSION來(lái)獲取這臺(tái)設(shè)備id并更新對(duì)應(yīng)的設(shè)備狀態(tài),因?yàn)槲椰F(xiàn)在遇到的情況是我的設(shè)備斷開(kāi)了連接,觸發(fā)了onclose但是$SESSION卻沒(méi)有值,導(dǎo)致無(wú)法運(yùn)行update函數(shù)更新設(shè)備狀態(tài)。手冊(cè)上說(shuō)客戶(hù)端或服務(wù)端與Gateway進(jìn)程的連接斷開(kāi)時(shí)觸發(fā)onclose,而$_SESSION的生命周期與client_id對(duì)應(yīng)socket連接的生命周期相同,當(dāng)客戶(hù)端連接斷開(kāi)后,對(duì)應(yīng)的客戶(hù)端$_SESSION將會(huì)清除。我是否可以理解為設(shè)備或服務(wù)器和gateway斷開(kāi)連接并不等同于設(shè)備斷開(kāi)socket連接,只有觸發(fā)onclose才算斷開(kāi)socket連接?如果是如此,那為何我的onclose中session取不到值?是我的程序問(wèn)題嗎?還請(qǐng)大神賜教,以下是我的gateway程序邏輯(PS:并不是我的所有設(shè)備都出現(xiàn)這個(gè)問(wèn)題)
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ù)庫(kù)中設(shè)備的狀態(tài)
}
}
1、設(shè)備或服務(wù)器和gateway斷開(kāi)連接即代表設(shè)備或服務(wù)器斷開(kāi)了對(duì)應(yīng)的socket連接,此時(shí)會(huì)觸發(fā) onClose 回調(diào);
2、onClose中可以獲取到 $_SESSION的值啊, 示例代碼中的 $uid 哪來(lái)的?? 這個(gè)“游離”變量也會(huì)導(dǎo)致 $_SESSION 邏輯為空。
已知有2種原因會(huì)導(dǎo)致這個(gè)問(wèn)題
1、客戶(hù)端發(fā)起連接后沒(méi)有發(fā)送數(shù)據(jù)連接就斷開(kāi),也就是onMessage沒(méi)有觸發(fā)過(guò)
2、觸發(fā)了onMessage但沒(méi)走到$_SESSION賦值的業(yè)務(wù)代碼
?
關(guān)于第1種很常見(jiàn),設(shè)備發(fā)起連接后還沒(méi)來(lái)得及發(fā)送數(shù)據(jù)連接已經(jīng)斷開(kāi)。還有外網(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的日志