0

0

Workerman和GatewayWorker什么关系_长连接应用开发选择【说明】

蓮花仙者

蓮花仙者

发布时间:2026-03-14 20:24:01

|

579人浏览过

|

来源于php中文网

原创

GatewayWorker 是基于 Workerman 构建的长连接通信框架,提供分组、广播、消息路由等 IM 能力,而 Workerman 仅负责底层网络 IO;三进程平级协作,消息下发必须经 Gateway 中转,不可直连客户端。

workerman和gatewayworker什么关系_长连接应用开发选择【说明】

Workerman 是底层 socket 类库,GatewayWorker 是专为长连接通讯封装的框架

Workerman 本身不提供“用户分组”“广播”“客户端互发消息”这些 IM 场景高频能力,它只管网络层:收包、发包、多进程管理、协议解析(WebSocket/HTTP/TCP 自定义)。你得自己写逻辑把 onMessage 里的数据路由到对应 client_id 或 group,还得自己维护连接状态、心跳、断线重连通知——这些重复劳动 GatewayWorker 全帮你做了。

GatewayWorker 不是 Workerman 的“升级版”,而是基于它构建的上层框架。装 workerman/gateway-worker 会自动拉取 workerman/workerman,但反过来不行;卸载前者不会删后者,前提是 composer.json 里显式写了 workerman/workerman

  • 需要做聊天室、APP 推送、设备上下线通知?直接用 GatewayWorker,省掉 70% 连接管理胶水代码
  • 只是写个内部 TCP 心跳探测服务,或短连接 HTTP API 网关?Workerman 更轻量,没冗余抽象
  • 要用 UDP?GatewayWorker 不支持,必须退回 Workerman 原生写 UdpConnection

GatewayWorker 的三个核心进程不是父子关系,而是对等通信节点

很多人误以为 Register 是 master,GatewayBusinessWorker 是 worker —— 实际上三者完全平级,靠长连接互相注册发现。这点直接影响部署方式和故障排查思路。

  • Register 进程只干一件事:存所有 Gateway 的内部地址(127.0.0.1:9600 这类),并广播给 BusinessWorker;它不处理任何业务,也不碰客户端连接
  • Gateway 进程只做网络 IO:维持成千上万客户端连接、转发数据、发心跳、踢超时连接;它不执行 PHP 业务逻辑,所以崩溃也不会丢消息上下文
  • BusinessWorker 才真正跑你的 Events.php,调 onMessage 处理登录、发消息、加群等;但它压根不知道客户端长什么样,只认 Gateway 发来的 $client_id$gateway_client_id

这种分离意味着:你可以把 Gateway 部署在高带宽低 CPU 的机器上,BusinessWorker 部署在高 CPU 的机器上,两者通过内网通信 —— 但前提是它们都能连上同一个 Register 进程(或集群)。

“向用户推送消息”必须走 GatewayWorker 的 API,不能直接 echo 给 socket

新手常犯的错误:在 onMessage 里写 $connection->send(...),结果消息根本发不出去,或者只发给自己。因为 GatewayWorker 的设计里,BusinessWorker 和客户端之间**没有直连**,所有下发都必须经由 Gateway 进程中转。

  • 发给单人:GatewayClient::sendToClient($client_id, $data)
  • 发给某群:GatewayClient::sendToGroup($group_id, $data)
  • 全局广播:GatewayClient::broadcastMessage($data)
  • 注意:$client_id 是 Gateway 分配的唯一字符串(如 "0000000000000001"),不是你业务系统的 uid;绑定 uid 到 client_id 要靠 bindUidunbindUid

如果漏掉 use GatewayClient; 或没在 start_business.php 中引入 GatewayClient 类,调用会静默失败,日志里也看不到报错 —— 这是最容易卡住的点。

Windows 开发 + Linux 部署时,路径和启动方式要手动对齐

官方 demo 在 Windows 下双击 bat 启动,Linux 下却要 php start.php start -d;而且 Applications/YourApp 目录结构必须严格匹配,否则 require_once 会找不到 Events.php

  • 别直接把 Windows 版 demo 整体扔进 ThinkPHP5 的 application/ 目录;建议新建独立目录如 server/,再 symlink 或复制 Applications/YourApp 进去
  • Linux 启动前务必检查:start_gateway.phpstart_business.php 中的 use 路径、require_once 的相对路径是否含 Windows 风格反斜杠 \
  • TP5 框架里想集成?不要改 TP 的入口文件去加载 GatewayWorker;正确做法是在 TP 根目录旁建 server/,用 supervisor 独立托管 GatewayWorker 进程,TP 只负责 HTTP 接口(如登录、获取 token)

跨平台最隐蔽的坑是文件权限和 SELinux:Linux 上 start.php 启动后没报错但进程立刻退出,大概率是 gateway 用户没权限读写 runtime/ 目录,或者 setuid 被禁用了 —— 这种问题不会抛 PHP 错误,得看 ps aux | grep gateway 和系统日志。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

162

2023.12.25

504 gateway timeout怎么解决
504 gateway timeout怎么解决

504 gateway timeout的解决办法:1、检查服务器负载;2、优化查询和代码;3、增加超时限制;4、检查代理服务器;5、检查网络连接;6、使用负载均衡;7、监控和日志;8、故障排除;9、增加缓存;10、分析请求。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

608

2023.11.27

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.12.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6655

2023.09.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号