请问,在同一个网站上,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??
感谢
试图通过搭建多个gatewayworker并不是什么好的方案,不同的页面发起的是不同的连接,考虑从针对连接的业务角度来区分就可以,这样就能对不同的连接执行不同的功能单元。
感谢回复,没有明白如何从连接的角度区分,我正在研究看看能不能从session中进行区分,连接的话,因为onclose是断开回调,无论如何连接,在断开的时候,都是触发onclose,无法进行区分。
每个tcp连接都是一个单独的连接对象,这样就可以为每个连接对象设置业务属性,比如唯一UID属性,据此就可以区分执行不同的功能单元;
另外session也可以啊,其实session也是针对连接而言的。
@614:嗯嗯。谢谢。我明白您说的意思了,但是感觉您说的靠连接有点难,因为onclose()的触发与onmessage()的触发不同,您说的靠连接区分,在onmessage()中可以使用,但是在onclose()中,因为触发onclose()的时候,连接和心跳都是已经断开的状态了,再此时,连接的资源信息有点少,uid识别起来又有些力不从心。我用session解决了这个问题,感谢您的回复,谢谢。
问题已解决。
可以使用一个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好了。