Workerman如何实现多人在线网页游戏(H5游戏)后端?

夜婷姑娘_1031

夜婷姑娘_1031

2026-05-22

980人浏览

原创

workerman 是 php 实现 h5 多人在线游戏后端最轻量、最可控的选择,但需手动实现会话管理、房间系统、消息鉴权、playerid绑定、输入校验、频率限制、精准广播、心跳检测与断线清理等全套逻辑。

workerman如何实现多人在线网页游戏(h5游戏)后端?

Workerman 是 PHP 实现 H5 多人在线游戏后端最轻量、最可控的选择,但前提是别把它当“黑盒框架”用——它不自动管理玩家会话、不内置房间系统、不处理消息鉴权,所有这些都得你亲手补全。

WebSocket 连接建立后必须立刻绑定唯一 playerID

Workerman 的 $connection 对象本身不带身份信息,onConnect 触发时只是裸连接。如果跳过这步直接进游戏逻辑,会出现“谁在移动”“谁落子了”完全不可追溯的问题。

  • 客户端首次发来的登录包(如 {"type":"login","token":"abc123"})必须校验有效性,再生成或复用一个服务端可控的 playerId(推荐用 uniqid('p_') 或 bin2hex(random_bytes(8)))
  • 把这个 playerId 显式存进全局容器,比如 $GLOBALS['players'][$playerId] = $connection,或更稳妥地用 SplObjectStorage 关联连接与玩家数据
  • 绝对不要依赖 $connection->id 做业务逻辑——它只在当前进程内唯一,Worker 进程重启或负载均衡下就失效

onMessage 中必须做输入过滤和频率限制

H5 游戏前端完全不可信,onMessage 收到的任何数据都可能是伪造的。不做校验会导致外挂横行:坐标瞬移、无限发弹、伪造胜利状态。

悠船
悠船

悠船是一款AI图像与设计工具,Midjourney 官方推出的中文版 AI 图像生成工具。

下载
  • 每个消息体必须含 playerId 字段,且和服务端记录的连接匹配;否则直接 $connection->close()
  • 对关键操作(如 {"type":"move","x":120,"y":85})检查数值范围(x/y 是否越界)、变化幅度(单次位移是否超 5 像素)、时间戳或 sequence ID 防重放
  • 用 $_SERVER['REQUEST_TIME_FLOAT'] 记录上次合法操作时间,对同一 playerId 限制 move 每秒 ≤10 次,attack ≤3 次,避免刷屏攻击
  • 拒绝解析非 JSON 格式、字段缺失、类型错误(如 x 是字符串而非数字)的数据,不抛异常,直接丢弃

广播逻辑不能无差别 foreach($connections)

Workerman 的 $worker->connections 是全部活跃连接集合,但 H5 游戏里绝大多数场景需要的是“同房间”或“视野内”广播,全量转发既浪费带宽又暴露隐私。

  • 必须自己维护房间映射表,例如 $rooms['room_abc'] = ['player_x', 'player_y'],并在玩家加入/退出/断线时同步更新
  • 移动、攻击等消息只推给同房间其他玩家;系统公告类消息才走全服广播
  • 广播前做数据精简:原始消息可能含调试字段、完整坐标、冗余时间戳,推送时只保留必要字段(如 {"type":"state","id":"p_123","x":120,"y":85,"ts":1716249021})
  • 避免在 onMessage 回调里嵌套循环广播——高并发下易阻塞事件循环;可考虑把广播任务压入 Worker::$processPool 异步队列(需自行封装)

心跳与断线检测必须手动实现

Workerman 不自动发 ping/pong,浏览器或 NAT 网关静默断开后,$connection 仍留在 $worker->connections 里,导致“假在线”、资源泄漏、广播错乱。

  • 在 onConnect 后立即启动定时器:$connection->send('{"type":"ping"}'),并设置 $connection->lastPing = $_SERVER['REQUEST_TIME_FLOAT']
  • 客户端需响应 pong,服务端在 onMessage 中识别 {"type":"pong"} 并刷新 lastPing
  • 另起一个 Timer::add() 每 15 秒扫描所有连接,若 $_SERVER['REQUEST_TIME_FLOAT'] - $connection->lastPing > 30,则 $connection->close() 并从房间/玩家表中清理
  • 务必在 onClose 回调里做清理动作,但不能只靠它——因为静默断连不会触发 onClose

真正难的不是写通 WebSocket 连接,而是让每个 playerId 在整个生命周期里始终可追溯、可控制、可隔离;Workerman 给你的是 TCP 连接的控制权,不是游戏逻辑的免写权。

相关文章

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2263

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5970

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5286

10

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9904

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5901

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3688

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4394

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3431

9

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程