Workerman TCP为什么需要自定义协议

陌明同学_6779

陌明同学_6779

2026-09-08

615人浏览

原创

workerman tcp默认不处理粘包拆包,因tcp是面向字节流协议,onmessage收到的数据可能不完整或混乱;必须通过自定义协议(含input/decode/encode方法)定义消息边界,否则依赖默认text协议易出错。

workerman tcp为什么需要自定义协议

Workerman TCP 默认不处理粘包拆包,直接收发原始字节流,所以业务层必须自己定义边界规则,否则 onMessage 收到的 $data 可能是半个包、两个包拼在一起,或带多余头尾——这不是 Workerman 的缺陷,而是 TCP 本身的流式特性决定的。

为什么 TCP 连接下 onMessage 会收到不完整或混乱的数据

TCP 是面向字节流的传输层协议,不保证“一次 send() 对应一次 recv()”。客户端连续发两段 "hello\n""world\n",服务端可能一次性收到 "hello\nworld\n",也可能只收到 "hel" 然后隔几毫秒再收到 "lo\nworld\n"。Workerman 的 onMessage 回调只在框架认为“一个完整应用消息已就绪”时触发,而判断依据完全来自你提供的协议类。

  • input 方法返回 0 → 框架继续攒数据
  • input 返回正整数 $n → 框架等缓冲区 ≥ $n 字节后截取前 $n 字节交给 decode
  • 没实现协议类?默认用 Workerman\Protocols\Text,它只认换行符 "\n" 作分隔 —— 一旦业务数据里含 \n(比如 JSON 日志、用户输入),立刻错乱

什么时候必须写自定义协议,而不是用 Text 协议

Text 协议只适合纯文本、严格以 \n 分隔、且内容不含 \n 的场景(如 telnet 调试命令)。只要出现以下任一情况,就得自己写:

  • 协议体是二进制(如 Unity 客户端用 BitConverter.GetBytes(len) 前置包长)
  • 消息含任意字节(比如 base64 图片、加密 payload、嵌套 JSON)
  • 需要校验和、版本号、加密标识等头部字段
  • 要兼容多个客户端(C#、Java、JS),需统一封包格式避免各端解析歧义

例如 C# 客户端发 4字节长度 + JSON字符串,PHP 服务端若不写 input 提前读出这 4 字节并返回总长,onMessage 就永远等不到完整包。

小橡皮AI
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

下载

input 方法写错是最常见的崩溃点

这个方法在每次收到新数据时被同步调用,必须快速返回,不能阻塞或做耗时操作。常见错误包括:

  • 没检查缓冲区长度就直接 unpack('N', $buffer)$buffer 不足 4 字节时 PHP 报 Warning 并返回 false,连接被断开
  • 返回负数或非整数 → Workerman 直接抛异常终止 worker 进程
  • 逻辑写成“等够 4 字节再读长度,再等够长度字节”,但 input 本就不该负责“等待”,只负责“告诉框架这次要等多少”
  • 对变长包(如 TLV)没做状态缓存,每次只看当前缓冲区片段,导致长度字段被截断无法识别

正确做法:用 strlen($buffer) 先兜底返回 0;足够时用 <code>unpack('Nlen', $buffer) 取长度,再返回 $len + 4(假设包长占 4 字节)。

协议类位置和命名不是可选配置,而是硬性约定

Workerman 通过反射自动加载协议类,路径和命名必须严格匹配:

  • 文件必须放在 Protocols/ 目录下(如 app/Protocols/MyTcp.php
  • 类名必须与文件名一致(class MyTcp
  • 必须声明 namespace Protocols;
  • 三个方法都得是 public static,签名不能改(input(string $buffer): int|false 等)

少一个条件,Workerman 启动时不会报错,但运行时会静默 fallback 到 Text 协议,问题表现为:本地测试正常,上线后高并发下突然大量粘包——因为协议根本没生效。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

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

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

126

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

162

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

127

13

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

140

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

60

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

40

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

2026.09.11

360

28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习