PHP

GatewayWorker笔记

GatewayWorker笔记

Posted by BY on June 25, 2019

序言

GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。

Register类的使用

Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址,Gateway进程和BusinessWorker通过Register进程得到通讯地址后,就可以建立起连接并通讯了。

Gateway类的使用

Gateway类用于初始化Gateway进程。Gateway进程是暴露给客户端的让其连接的进程。所有客户端的请求都是由Gateway接收然后分发给BusinessWorker处理,同样BusinessWorker也会将要发给客户端的响应通过Gateway转发出去。

BusinessWorker类的使用

BusinessWorker类其实也是基于基础的Worker开发的。BusinessWorker是运行业务逻辑的进程,BusinessWorker收到Gateway转发来的事件及请求时会默认调用Events.php中的onConnect onMessage onClose方法处理事件及数据,开发者正是通过实现这些回调控制业务及流程。

Events类的回调属性

Events::onConnect

void Events::onConnect(string $client_id);

    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToClient($client_id, json_encode(array(
            'type'      => 'init',
            'client_id' => $client_id
        )));
    }

Events::onMessage

void Events::onMessage(string $client_id, mixed $recv_data);

Events::onClose

void Events::onClose(string $client_id);

Lib\Gateway类提供的接口

Gateway::joinGroup

void Gateway::joinGroup(string $client_id, mixed $group);

    public static function onMessage($client_id, $message)
    {
        // $message = '{"type":"join","group":"xxxxx"}'
        $req_data = json_decode($message, true);
        Gateway::joinGroup($client_id, $req_data['group']);
    }

Gateway::leaveGroup

void Gateway::leaveGroup(string $client_id, mixed $group);

Gateway::sendToGroup

void Gateway::sendToGroup(mixed $group, string $message [, array $exclude_client_id = null [, bool $raw = false]]);

启动与停止

启动

以debug(调试)方式启动

php start.php start

以daemon(守护进程)方式启动

php start.php start -d

停止

php start.php stop

重启

php start.php restart

平滑重启

php start.php reload

查看状态

php start.php status