问下如何在webman的gateway-worker插件中定义多个协议(tcp和websocket),每个协议有自己的Events消息处理类
文档示例好像只有一个Events处理类 https://www.workerman.net/plugin/5
<?php
use Webman\GatewayWorker\Gateway;
use Webman\GatewayWorker\BusinessWorker;
use Webman\GatewayWorker\Register;
return [
'gateway' => [
'handler' => Gateway::class,
'listen' => 'websocket://0.0.0.0:7272',
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 2300,
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
],
'gateway-tcp' => [ // 假设增加一个tcp端口的gateway进程
'handler' => Gateway::class,
'listen' => 'tcp://0.0.0.0:7373', // 注意这里端口不能重复
'count' => cpu_count(),
'reloadable' => false,
'constructor' => ['config' => [
'lanIp' => '127.0.0.1',
'startPort' => 3300, // 注意这里端口不能重复,步数大大一些,不能和上面2300太接近
'pingInterval' => 25,
'pingData' => '{"type":"ping"}',
'registerAddress' => '127.0.0.1:1236',
'onConnect' => function(){},
]]
],
'worker' => [
'handler' => BusinessWorker::class,
'count' => cpu_count()*2,
'constructor' => ['config' => [
'eventHandler' => plugin\webman\gateway\Events::class,
'name' => 'ChatBusinessWorker',
'registerAddress' => '127.0.0.1:1236',
]]
],
'register' => [
'handler' => Register::class,
'listen' => 'text://127.0.0.1:1236',
'count' => 1, // Must be 1
'constructor' => []
],
];
不支持按协议设置Events, 不过可以在Events里面通过
$_SERVER['GATEWAY_PORT']
区分协议,然后自己调用相应的类。好的,老大,我这样尝试了,好像可以正常运行,好像还不影响还会🤗🤗
有个疑问,就是如果按照$_SERVER['GATEWAY_PORT']这个来区分,Gateway::sendToUid时,好像没发区分协议
正常业务Gateway::sendToUid 不需要区分协议,例如用户同时登录了移动端是tcp连接,网页端ws连接。
要给用户发消息,两个端都需要发,直接Gateway::sendToUid即可,Gateway::sendToUid不区分协议。
如果要区分协议需要自己按协议分组,例如ws一组,tcp一组。
例如 joinGroup($client_id, 'uid_ws_1'); sendToGroup('uid_ws_1', $data); 这样就是给ws协议uid为1的用户发数据。
好的,谢谢老大