Workerman 5.2 正式支持原生解析 HTTP 分块传输请求体,需启用 HTTP 协议栈(监听地址以 http:// 开头)、使用 5.2+ 版本并显式指定协议;$request->rawBody() 自动还原完整内容,大体积数据推荐用 $request->getBodyStream() 流式读取,且仅当请求头含 Transfer-Encoding: chunked 且无 Content-Length 时生效。

Workerman 5.2 正式支持原生解析 HTTP 分块传输(Chunked Transfer Encoding)请求体,不再需要手动扫描 boundary 或逐行读取 rawBody——但前提是必须启用 HTTP 协议栈且请求头中明确携带 Transfer-Encoding: chunked,否则 $request->rawBody() 仍为空或截断。
确认服务已启用 HTTP 协议栈
第一步:监听地址必须写成 http:// 开头,不能是 tcp://。否则 onMessage 收到的是裸字节流,Request 对象不会被自动注入。
第二步:确保使用 Workerman 5.2+ 版本,并引入 Request 类。旧版或未启用 HTTP 协议时,chunked 请求会被直接丢弃或解析失败。
第三步:启动脚本中必须显式指定协议类型:$worker = new Worker('http://0.0.0.0:8080'); —— 这是整个功能生效的前提,缺一不可。
接收并解析 chunked 请求体
Workerman 5.2 在收到合法 chunked 编码请求后,会自动拼接所有块并填充到 $request->rawBody() 中,无需手动解码。
方法一:直接读取完整 body(适用于小体积流式数据)
在 onMessage 回调中,$body = $request->rawBody(); 即可获取已还原的原始内容。这一步操作起来很简单,但注意:若请求体超 2MB,默认会触发内存限制,需配合 $request->setBodyLimit(0) 关闭限制。
方法二:流式处理大块数据(推荐用于日志、音视频流等)
调用 $request->getBodyStream() 获取一个可迭代的 stream 资源,用 fread($stream, 8192) 分批读取,避免一次性加载全部内容到内存。
注意:$request->post() 和 $request->get() 对 chunked 请求无效 —— 因为它们依赖 form-data 或 query string 解析逻辑,而 chunked 是纯二进制流,没有字段结构。
验证 chunked 请求是否被正确识别
第一步:检查请求头是否含 Transfer-Encoding: chunked。
可通过 $request->header('transfer-encoding') 获取,返回值为字符串 chunked 才代表客户端真正发了分块请求。
第二步:确认 Content-Length 头不存在或为 0。
chunked 编码下 Content-Length 必须被移除,否则 Workerman 会拒绝该请求并返回 400 错误。
第三步:打印 strlen($request->rawBody()) 并与客户端发送的总字节数比对,一致说明解析无损。若长度明显偏小,大概率是客户端未正确结束块(漏发 0\r\n\r\n)。

















