Workerman怎么上传大文件_分片接收与流式处理技巧【技巧】

星夢妙者

星夢妙者

2026-03-11

307人浏览

原创

workerman需流式解析multipart/form-data边界并分片处理,因$_files不生效、php上传配置无效且php://input不支持分块;安全接收分片须提取boundary、逐行扫描定位字段、精确截取payload写入临时文件,并用file_id/chunk_index实现幂等校验与断点续传。

workerman怎么上传大文件_分片接收与流式处理技巧【技巧】

Workerman 本身不解析 multipart/form-data,大文件上传必须手动处理原始请求体——直接走流式读取 + 分片校验,否则必爆内存或丢数据。

为什么不能用 $_FILES 或框架自动解析?

Workerman 是纯异步 TCP/HTTP 服务器,不依赖 PHP-FPM,$_FILES 在这里根本不会被填充。所有上传数据都裸露在 $request->rawBody()$connection->recv() 中,靠自己拆解边界(boundary)。一旦用错方式(比如等完整 body 收完再处理),50MB 文件就可能让 Worker 进程卡死或 OOM。

  • PHP 的 upload_max_filesizepost_max_size 对 Workerman 无效——这些是 PHP-FPM 的配置,Workerman 完全绕过
  • 试图用 file_get_contents('php://input') 会失败:它只对一次性的短请求有效,且不支持分块传输(chunked encoding)
  • 真实场景中,前端往往用 fetch + FormData 发送分片,但 Workerman 收到的是“一整段带 boundary 的二进制流”,不是结构化数组

怎么安全接收一个分片?关键三步

分片上传不是“接收文件”,而是“按协议提取一段二进制 payload”。核心在于识别 boundary、定位字段、截取 blob —— 全程流式,不落地、不缓存全文本。

Workerman
Workerman

最新主版本,继续强化高性能异步网络能力,适合 WebSocket、HTTP 服务、长连接、IM、IoT 等场景。 本次版本主要围绕稳定性、协议兼容以及连接处理能力优化,依旧保持超轻量和纯 PHP 特性。 适用于 PHP 8.x 环境,可配合 webman、GatewayWorker 等生态使用。

下载
  • $request->header('content-type') 提取 boundary=...,构造正则或字节扫描器
  • fgets()stream_get_line() 逐行读 body 流,跳过 header 行,直到遇到 --{boundary}Content-Disposition: form-data; name="chunk"; filename="..."
  • 真正有效的分片数据从下一个 \r\n\r\n 开始,到下一个 --{boundary} 前结束;用 fread($stream, $length) 精确截取,避免读多或读少
  • 建议把分片写入临时文件(如 /tmp/upload_{file_id}_{index}.part),而不是存在内存里——Worker 进程重启后还能续传

onMessage 里直接处理分片?小心并发冲突

Workerman 的 onMessage 是单连接单线程回调,但多个客户端同时上传时,不同连接的分片可能并发写同一个文件名(比如都叫 video.mp4),导致覆盖或损坏。

  • 必须用唯一标识区分上传会话:file_id(前端传的全局 hash)、chunk_index(分片序号)、total_chunks(总片数)缺一不可
  • 不要用 file_put_contents(..., FILE_APPEND) 拼接分片——它不是原子操作,高并发下会乱序;应独立保存每个 .part,合并阶段再按序 cat
  • 合并前务必校验每个分片的 md5(前端计算并随分片上传),否则网络丢包或中间代理篡改会导致静默损坏
  • 合并完成后,用 rename() 替换目标文件,避免“半成品”被其他进程读到

断点续传怎么判断“这个分片我收过了”?

不是查数据库,而是查文件系统——简单、快、不依赖外部服务。

  • 约定存储路径为 /upload/{file_id}/chunks/{index}.part,收到分片前先 file_exists() 检查
  • 如果已存在,跳过写入,直接返回 {"code":200,"msg":"already received"}(前端据此跳过该分片)
  • 注意权限:Workerman 进程用户必须对 /upload 目录有读写权,且禁用 open_basedir 限制(否则 file_exists 失败)
  • 别用 MySQL 记录分片状态——IO 成瓶颈,且单点故障会让整个上传链路瘫痪

真正的难点不在“怎么收”,而在“怎么确认没丢、没重、没乱”。分片哈希、文件系统级幂等、流式边界识别——这三环漏一环,上传就不可靠。很多人卡在 boundary 解析失败却去调 PHP 配置,方向错了。

相关文章

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

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

下载

相关标签:

workerman

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

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

2023.06.14

2469

6

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

2023.10.30

432

4

Workerman安装配置教程
Workerman安装配置教程

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

2026.05.20

41

15

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

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

2026.05.20

139

12

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

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

2026.05.20

62

13

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

10

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习