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

bv

请问,在同一个网站上,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??
 
感谢

2297 2 0
2个回答

phpcreeper

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

  • bv 2019-09-05

    感谢回复,没有明白如何从连接的角度区分,我正在研究看看能不能从session中进行区分,连接的话,因为onclose是断开回调,无论如何连接,在断开的时候,都是触发onclose,无法进行区分。

  • phpcreeper 2019-09-05

    每个tcp连接都是一个单独的连接对象,这样就可以为每个连接对象设置业务属性,比如唯一UID属性,据此就可以区分执行不同的功能单元;
    另外session也可以啊,其实session也是针对连接而言的。

  • bv 2019-09-06

    @614:嗯嗯。谢谢。我明白您说的意思了,但是感觉您说的靠连接有点难,因为onclose()的触发与onmessage()的触发不同,您说的靠连接区分,在onmessage()中可以使用,但是在onclose()中,因为触发onclose()的时候,连接和心跳都是已经断开的状态了,再此时,连接的资源信息有点少,uid识别起来又有些力不从心。我用session解决了这个问题,感谢您的回复,谢谢。

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好了。
 
 

  • 暂无评论
年代过于久远,无法发表回答
×
🔝