0

0

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

星夢妙者

星夢妙者

发布时间:2026-03-11 10:33:25

|

287人浏览过

|

来源于php中文网

原创

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 —— 全程流式,不落地、不缓存全文本。

Molica AI
Molica AI

一款聚合了多种AI工具的一站式创作平台

下载
  • $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 配置,方向错了。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

666

2023.08.14

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

热门下载

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

精品课程

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

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