基于 reactphp-x/worker 的分布式长连接 GatewayWorker 实现,架构参考 Workerman GatewayWorker,支持 TCP 与 WebSocket(WebSocket 使用 reactphp-x/websocket-middleware)。
Client (TCP/WebSocket)
↓
Gateway ←→ Register ←→ BusinessWorker
↓ ↓
转发连接事件 Events 业务逻辑
- Register:服务注册中心,协调 Gateway 与 BusinessWorker 地址发现
- Gateway:接受客户端长连接,通过二进制 GatewayProtocol 转发给 BusinessWorker
- BusinessWorker:处理
onConnect/onMessage/onClose业务逻辑
composer installcd examples
php start.php start默认端口:
| 服务 | 地址 |
|---|---|
| Register | 127.0.0.1:1238(仅内网) |
| Gateway TCP | 0.0.0.0:8282 |
| Gateway WebSocket | ws://0.0.0.0:8283/ws |
| BusinessWorker | 4 进程 |
telnet 127.0.0.1 8282<script>
var conn = new WebSocket('ws://127.0.0.1:8283/ws');
conn.onopen = () => conn.send('Hello!');
conn.onmessage = (e) => console.log(e.data);
</script>BusinessWorker 发送非 JSON 载荷(如 Needle Engine SyncedTransform 的 FlatBuffer STRS 消息)时,须将 $raw 设为 true:
// 单播二进制
Gateway::sendToClient($clientId, $binaryPayload, raw: true);
// 组播二进制(第四个参数)
Gateway::sendToGroup($group, $binaryPayload, $excludeClientId, raw: true);Gateway 收到 FLAG_NOT_CALL_ENCODE 后,会以 WebSocket binary frame(opcode 0x2)发给浏览器,而不是 text frame。若以 text frame 发送非 UTF-8 数据,浏览器会报错并断开连接。
参考 examples/Applications/YourApp/:
start_register.php— 注册中心start_gateway_tcp.php— TCP Gatewaystart_gateway_websocket.php— WebSocket Gatewaystart_businessworker.php— 业务 WorkerEvents.php— 业务回调
MIT