必须部署channel服务作为中心通信枢纽,各worker连接同一channel并注册唯一事件名;通过gatewayworker集群与register中心统一管理连接路由,实现跨服务器精准推送。

要在多台服务器之间实现Workerman主动推送信息的同步,必须让各节点能感知彼此在线状态、共享消息通道,并确保任意一台服务器发起的推送能触达所有目标客户端,无论其当前连接在哪台服务器上。
部署Channel服务作为中心通信枢纽
第一步:在独立服务器(如192.168.1.1)上启动Channel服务端,监听端口2206。
这一步不可省略——Channel是GatewayWorker和Worker间跨进程、跨机器通信的核心中间件,没有它,各服务器Worker无法互相广播或定向投递消息。
第二步:在每台业务服务器的Worker启动时,调用Channel\Client::connect('192.168.1.1', 2206)建立长连接。
【必须确保所有Worker都连向同一台Channel服务】,否则消息会分裂成多个孤岛,A服务器发的消息B服务器根本收不到。
第三步:为每个Worker进程注册唯一事件名,例如$event_name = 'worker_' . $worker->id,再用Channel\Client::on($event_name, ...)绑定处理逻辑。
这样当其他服务器通过Channel发送worker_3事件时,只有ID为3的Worker进程响应,避免全量广播带来的性能浪费。
使用GatewayWorker统一管理连接与路由
方法一:部署Gateway集群,每台服务器运行一个GatewayWorker实例,监听WebSocket端口(如4236),并配置相同register地址指向注册中心(如192.168.1.2:1236)。
方法二:在每台GatewayWorker的start_gateway.php中设置$gateway->registerAddress = '192.168.1.2:1236';,确保所有Gateway向同一个Register服务注册自身连接列表。
方法三:业务Worker不再直接持有客户端连接,而是通过GatewayClient调用sendToUid()或sendToGroup()发送消息。
Gateway会根据Register中维护的UID→Gateway映射关系,自动将消息转发到对应客户端实际连接的那台Gateway服务器上。
推送消息时指定目标并触发跨服分发
第一步:后端业务代码中构造推送数据,例如:GatewayClient::sendToUid($uid, json_encode(['type'=>'msg','content'=>'hello']));
第二步:GatewayClient内部会将该请求发往Register服务,Register查出$uid当前连接在gateway@192.168.1.4:4236,于是把消息路由过去。
第三步:目标GatewayWorker收到后,从自身连接池中找到该UID对应的connection,调用$connection->send(...)完成最终投递。
整个过程对开发者透明,你只需关注“推给谁”,无需关心“他在哪台服务器上”。
注意:若使用纯Worker不走Gateway,必须自行在Channel上发布广播事件,例如Channel\Client::publish('broadcast', ['content' => $msg]),所有订阅该事件的Worker都会收到并各自遍历本地connections发送——但这种方式无法精准投递给特定UID,仅适合群发。











