如何在webman的gateway-worker插件中定义多个协议

咸鱼.php

问题描述

问下如何在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' => []
    ],
];
108 1 1
1个回答

不支持按协议设置Events, 不过可以在Events里面通过 $_SERVER['GATEWAY_PORT'] 区分协议,然后自己调用相应的类。

  • 咸鱼.php 2天前
    <?php
    
    use plugin\webman\gateway\Tcp;
    use plugin\webman\gateway\WebSocket;
    
    use Webman\GatewayWorker\Gateway;
    use Webman\GatewayWorker\Register;
    use Webman\GatewayWorker\BusinessWorker;
    
    return [
        'tcp-gateway'        => [
            'handler'     => Gateway::class,
            'listen'      => 'tcp://0.0.0.0:7000',
            '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 () {
                    },
                ]
            ]
        ],
        'tcp-worker'         => [
            'handler'     => BusinessWorker::class,
            'count'       => cpu_count() * 2,
            'constructor' => [
                'config' => [
                    'eventHandler'    => Tcp::class,
                    'name'            => 'TcpBusinessWorker',
                    'registerAddress' => '127.0.0.1:1236',
                ]
            ]
        ],
        'tcp-register'       => [
            'handler'     => Register::class,
            'listen'      => 'text://127.0.0.1:1236',
            'count'       => 1,
            'constructor' => []
        ],
        'websocket-gateway'  => [
            'handler'     => Gateway::class,
            'listen'      => 'websocket://0.0.0.0:7272',
            'count'       => cpu_count(),
            'reloadable'  => false,
            'constructor' => [
                'config' => [
                    'lanIp'           => '127.0.0.1',
                    'startPort'       => 3300,
                    'pingInterval'    => 25,
                    'pingData'        => '{"type":"ping"}',
                    'registerAddress' => '127.0.0.1:1237',
                    'onConnect'       => function () {
                    },
                ]
            ]
        ],
        'websocket-worker'   => [
            'handler'     => BusinessWorker::class,
            'count'       => cpu_count() * 2,
            'constructor' => [
                'config' => [
                    'eventHandler'    => WebSocket::class,
                    'name'            => 'WebSocketBusinessWorker',
                    'registerAddress' => '127.0.0.1:1237',
                ]
            ]
        ],
        'websocket-register' => [
            'handler'     => Register::class,
            'listen'      => 'text://127.0.0.1:1237',
            'count'       => 1,
            'constructor' => []
        ],
    ];
    

    好的,老大,我这样尝试了,好像可以正常运行,好像还不影响还会🤗🤗

  • 咸鱼.php 2天前

    有个疑问,就是如果按照$_SERVER['GATEWAY_PORT']这个来区分,Gateway::sendToUid时,好像没发区分协议

  • walkor 2天前

    正常业务Gateway::sendToUid 不需要区分协议,例如用户同时登录了移动端是tcp连接,网页端ws连接。
    要给用户发消息,两个端都需要发,直接Gateway::sendToUid即可,Gateway::sendToUid不区分协议。

    如果要区分协议需要自己按协议分组,例如ws一组,tcp一组。
    例如 joinGroup($client_id, 'uid_ws_1'); sendToGroup('uid_ws_1', $data); 这样就是给ws协议uid为1的用户发数据。

  • 咸鱼.php 12小时前

    好的,谢谢老大

×
🔝