請問,在同一個網(wǎng)站上,A頁面和B頁面,都使用了gatewayworker的onclose功能,
?
比如A頁面在關閉后,觸發(fā)了onclose中的a()函數(shù)操作。
B頁面在關閉頁面后,觸發(fā)了onclose中的b()函數(shù)操作。
?
請問這種情況下,如何使用switch?case?或者其它方式來使用同一個onclose() ?
?
有辦法解決嗎?還是說,只能再搭建一個gatewayworker ,然后讓A頁面和B頁面分別連接兩個不同的gatewayworker??那如果這個網(wǎng)站有A,B,C,D,E.....很多頁面,每個頁面關閉后觸發(fā)的onclose()操作都不一樣,那是不是需要分別建立N多個gatewayworker??
?
感謝
試圖通過搭建多個gatewayworker并不是什么好的方案,不同的頁面發(fā)起的是不同的連接,考慮從針對連接的業(yè)務角度來區(qū)分就可以,這樣就能對不同的連接執(zhí)行不同的功能單元。
感謝回復,沒有明白如何從連接的角度區(qū)分,我正在研究看看能不能從session中進行區(qū)分,連接的話,因為onclose是斷開回調(diào),無論如何連接,在斷開的時候,都是觸發(fā)onclose,無法進行區(qū)分。
每個tcp連接都是一個單獨的連接對象,這樣就可以為每個連接對象設置業(yè)務屬性,比如唯一UID屬性,據(jù)此就可以區(qū)分執(zhí)行不同的功能單元;
另外session也可以啊,其實session也是針對連接而言的。
@614:嗯嗯。謝謝。我明白您說的意思了,但是感覺您說的靠連接有點難,因為onclose()的觸發(fā)與onmessage()的觸發(fā)不同,您說的靠連接區(qū)分,在onmessage()中可以使用,但是在onclose()中,因為觸發(fā)onclose()的時候,連接和心跳都是已經(jīng)斷開的狀態(tài)了,再此時,連接的資源信息有點少,uid識別起來又有些力不從心。我用session解決了這個問題,感謝您的回復,謝謝。
問題已解決。
?
可以使用一個gatewayworker,來處理多個onclose()觸發(fā)。
?
解決方案:
?
我用了\GatewayWorker\Lib\Gateway::setSession?接口,
Gateway::setSession($client_id, $session);通過setsession接口,在session中存儲一個行為識別碼,然后在該用戶斷線后,觸發(fā)onclose的時候,用switch?case去接收和判斷行為識別碼,不同的行為識別碼對應不同的行為執(zhí)行方式。
?
switch($IMS_code){
case "***":
這樣就可以將onclose()的行為處理方式與onmessage()的switch?case處理方式一樣。
?
有幾個發(fā)現(xiàn)的點:
(1)setSession()?來設置的session,在服務器上的session文件中是空白的,但是gatewayworker的onclose卻可以從空白文件中讀取session數(shù)據(jù),這個比較神奇,如果使用傳統(tǒng)的php語法來設置session數(shù)據(jù),在服務器上是可以看到設置的數(shù)據(jù)的,但是在onclose中,無法讀取session數(shù)據(jù),而使用setsession接口來設置session數(shù)據(jù),在服務器上是看不到session數(shù)據(jù)的,但是onclose可以讀取到數(shù)據(jù)。神奇。
?
(2)Gateway::onClose回調(diào)里無法使用Gateway::getSession來獲得當前用戶的session數(shù)據(jù),但是仍然可以使用$_SESSION變量獲得。
?
多說一句,還有很多方法可以解決這個問題,有一個笨方法,就是把識別碼寫在數(shù)據(jù)庫中,然后斷開連接后,onclose根據(jù)用戶id——uid,去數(shù)據(jù)庫里找識別碼。但是這個方法不如session方便,所以還是用session好了。
?
?