请问在同一个网站的多个页面上使用gatewayworker的onclose功能,需要安装多个gatewayworker吗?

请问,在同一个网站上,A页面和B页面,都使用了gatewayworker的onclose功能,
 
比如A页面在关闭后,触发了onclose中的a()函数操作。
B页面在关闭页面后,触发了onclose中的b()函数操作。
 
请问这种情况下,如何使用switch case 或者其它方式来使用同一个onclose() ?
 
有办法解决吗?还是说,只能再搭建一个gatewayworker ,然后让A页面和B页面分别连接两个不同的gatewayworker? 那如果这个网站有A,B,C,D,E.....很多页面,每个页面关闭后触发的onclose()操作都不一样,那是不是需要分别建立N多个gatewayworker??
 
感谢
已邀请:

blogdaren - 乐于分享的PHP码农【http://www.blogdaren.com】

赞同来自: bv

试图通过搭建多个gatewayworker并不是什么好的方案,不同的页面发起的是不同的连接,考虑从针对连接的业务角度来区分就可以,这样就能对不同的连接执行不同的功能单元。

bv

赞同来自:

问题已解决。
 
可以使用一个gatewayworker,来处理多个onclose()触发。
 
解决方案:
 
我用了\GatewayWorker\Lib\Gateway::setSession 接口,
 Gateway::setSession($client_id, $session);
通过setsession接口,在session中存储一个行为识别码,然后在该用户断线后,触发onclose的时候,用switch case去接收和判断行为识别码,不同的行为识别码对应不同的行为执行方式。
 
 switch($IMS_code){
case "*******":

这样就可以将onclose()的行为处理方式与onmessage()的switch case处理方式一样。
 
有几个发现的点:
(1)setSession() 来设置的session,在服务器上的session文件中是空白的,但是gatewayworker的onclose却可以从空白文件中读取session数据,这个比较神奇,如果使用传统的php语法来设置session数据,在服务器上是可以看到设置的数据的,但是在onclose中,无法读取session数据,而使用setsession接口来设置session数据,在服务器上是看不到session数据的,但是onclose可以读取到数据。神奇。
 
(2)
Gateway::onClose
回调里无法使用
Gateway::getSession
来获得当前用户的session数据,但是仍然可以使用
$_SESSION
变量获得。
 
多说一句,还有很多方法可以解决这个问题,有一个笨方法,就是把识别码写在数据库中,然后断开连接后,onclose根据用户id——uid,去数据库里找识别码。但是这个方法不如session方便,所以还是用session好了。
 
 

要回复问题请先登录注册