Webman中WebSocket通信必须通过GatewayClient完成,它是Worker进程调用Gateway的唯一合法通道;需正确配置gateway地址、Register服务及启动顺序,否则消息静默丢失。

Webman 本身不直接暴露 GatewayWorker 的底层通信接口,所有 WebSocket 相关的广播、单发、连接管理必须通过 GatewayClient 组件完成 —— 这是唯一被设计为“从 Worker 进程安全调用 Gateway”的通道。
GatewayClient 是唯一合法入口
Webman 的业务逻辑运行在 Worker 进程中,而真正处理客户端 TCP 连接和 WebSocket 协议的是 Gateway 进程。两者物理隔离,不能直连。GatewayClient 就是官方提供的“代理客户端”,它封装了与 Register 服务通信、自动发现 Gateway 地址、维持长连接、序列化命令等细节。
- 必须在
config/bootstrap.php或启动前引入:require_once DIR . '/vendor/autoload.php'; - 必须配置
gateway地址(默认是text://127.0.0.1:9501),否则GatewayClient会连接失败并静默丢弃消息 - 不支持在
php start.php start -d以外的上下文使用(比如 CLI 脚本单独跑,没加载Worker环境时会报Class GatewayClient not found)
sendToAll() 和 sendToClient() 行为差异
这两个函数看起来相似,但底层触发的通信路径完全不同:
-
GatewayClient::sendToAll($data):- 向所有已注册的
Gateway进程广播一条“广播指令” - 每个
Gateway收到后,再遍历自己维护的全部客户端连接逐个发送 - 数据不经过序列化压缩,
$data必须是字符串或可json_encode的结构
- 向所有已注册的
-
GatewayClient::sendToClient($client_id, $data):
dcc-cli-gateway下载通过 `dcc-mcp-cli` 命令行工具控制实时 DCC 主机(Maya、Blender、Houdini、Photoshop、3ds Max 以及自定义的 Studio 工具)。 针对 ClawHub、OpenClaw、Cursor、Claude 和支持 shell 的 Agent 主机:验证网关健康状态、列出已注册的 DCC 实例、搜索工具、检查 Schema、调用工具——全程无需直接编写或发送 MCP 请求。 若系统中未安装 `dcc-mcp-cli`,需先征得用户同意,再从 GitHub
- 先查
Register获取该$client_id所属的Gateway进程地址 - 再向那个特定
Gateway发送“定向指令” - 如果
$client_id已断开或从未注册过,调用不报错,但无任何效果(不会抛异常,也不会写日志)
- 先查
注意:
$client_id是Gateway分配的唯一字符串,形如"192.168.1.100:54321",不是你数据库里的用户 ID
onConnect/onMessage 回调里不能直接调用 GatewayClient
Gateway 进程自身无法加载 GatewayClient —— 它只负责转发,不跑业务逻辑。你在 app/gateway/Events.php 里写的回调,是在 Gateway 进程空间执行的,此时:
-
GatewayClient类不可用(未加载,也不该加载) - 所有业务判断(比如权限校验、消息存库、用户状态更新)必须挪到
Worker进程里做 - 正确做法是:在
Events.php中用Gateway::sendToWorker($data)把原始数据推给Worker,再由Worker处理完后反向调用GatewayClient
配置项和路径容易错的三个地方
-
config/process.php中的gateway配置必须和start_gateway.php里Gateway实例监听的内部地址一致,常见错误是协议写成tcp://(应为text://)或端口填错 -
Register服务必须先于Gateway启动,否则Gateway注册失败,GatewayClient就找不到任何可用节点 -
GatewayClient默认使用Register的地址是text://127.0.0.1:1236,如果你改过start_register.php的监听端口,就必须同步改config/plugin/webman/gateway-worker/app.php里的register_address
GatewayClient 看似简单,但它背后依赖 Register 的可用性、Gateway 的注册状态、以及 Worker 进程是否已正确加载环境 —— 任一环节断掉,消息就静默消失,且没有任何错误提示。调试时优先检查 workerman.log 里有没有 “connect to register failed” 或 “no gateway available” 这类线索。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










