Gatewaywork框架中使用AsyncTcpConnection的问题

daling

看完两个手册,Gatewaywork好用,还有个问题,需要在bussinessWorker进程onWorkerStart时使用到AsyncTcpConnection异步连接类,并在AsyncTcpConnection的Onmessage回调函数中组播处理后的数据,如何在events.php中使用AsyncTcpConnection,并在AsyncTcpConnection中使用sendToGroup组播函数。

有没有好的方法或思路?

因为AsyncTcpConnection的连接是一直保持在整个Gatewaywork生命周期的,直接在start_businessworker.php无法直接调用Gateway::sendToGroup(),在Events好像也没法直接创建AsyncTcpConnection。

阅读 3602
7个回答

walkor

Events 直接创建AsyncTcpConnection链接就好了,一样的

  • 暂无评论
daling

@walkor ,对php语法不熟,手册的示例代码无法直接搬去用,如何在events.php中初始化一个AsyncTcpConnection链接。谢谢

  • 暂无评论
daling

找到了,谢谢。在events.php中也有个businessWorker进程的onWorkerStart 事件,可以实现,但是如果设置了多个businessWorker进程,会启动多个onWorkerStart 事件,这就导致会创建多个AsyncTcpConnection链接,而我只需要也只能保持一个AsyncTcpConnection链接,应该在哪里创建这个AsyncTcpConnection链接呢?并且需要在AsyncTcpConnection里实现sendToGroup

  • 暂无评论
walkor

手册:http://doc3.workerman.net/worker-development/workerid.html
可以根据容器id来设置异步链接,比如只在0号businessWorker进程设置异步链接

class Events {
    public static function ($businessWorker) {
        if ($businessWorker->id == 0) {
            $con = new AsyncTcpConnection('.....');
        }
      }
...
}
  • 暂无评论
daling

可用,谢谢,具体性能测试后再贴上来,翻遍所有手册,因为gw允许一个client加入多个广播组,没看到可以有函数可以调某个client所加入的组,因为业务要求client只能加入一个组,好像只能先遍历所有广播组,再getClientSessionsByGroup找出已经加入的组,然后leaveGroup,再joinGroup新的组,好像没有效率的样子。

  • 暂无评论
walkor

client加入了哪些组直接放session里就好了。client_id自身的会话信息都可以放到session里。

$_SESSION = group_1;
$_SESSION = group_2;

然后直接读$_SESSION就得到这个client_id加入的所有的组了

  • 暂无评论
daling

懂了,谢谢

  • 暂无评论