Workerman 5.2.3 处理 HTTP 文件上传必须手动解析 multipart/form-data 请求体,禁用 $_FILES;需以 http:// 或 https:// 初始化 Worker,流式提取文件块并落盘,显式设置响应头与状态码。

Workerman 5.2.3 处理 HTTP 文件上传请求,不能依赖 $_FILES 或传统 PHP-FPM 的上传机制——它根本不会被填充。必须手动解析原始 multipart/form-data 请求体,流式提取字段与文件块,否则大文件会直接导致内存溢出或连接超时。
必须启用 HTTP 协议并正确声明监听地址
确保 Worker 实例使用 http:// 前缀初始化,例如:
-
$worker = new Worker('http://0.0.0.0:8080');(不是tcp://或只写端口) - 若用
https://,需配置有效 SSL 证书;自签名证书不被 HTTP/2 支持,且多数客户端会拒绝 - Windows 用户注意关闭 IIS、Skype 等默认占用 80/443 端口的程序,否则
Worker::runAll()可能静默失败
从 Request 对象中安全提取上传数据
$request 是 Workerman\Protocols\Http\Request 实例,所有上传信息都需主动解析:
- 用
$request->header('content-type')提取boundary,例如:multipart/form-data; boundary=----WebKitFormBoundaryabc123 -
$request->post()仅适用于application/x-www-form-urlencoded和标准multipart/form-data表单字段,不处理二进制文件内容 -
$request->file()在 5.2.3 中仍存在,但仅对简单单文件上传“看似可用”;实际生产中不可靠,因它内部尝试缓存全文本,易触发 OOM - 真正可靠的方式是调用
$request->rawBody()获取完整原始请求体(小文件可接受),或结合stream_get_line()+fread()流式扫描边界(推荐用于大文件或分片场景)
分片上传与大文件落地的关键操作
前端如用 fetch + FormData 分片上传,后端需按协议逐段截取,不缓存整块 body:
- 根据
boundary构造扫描逻辑:跳过 header 行,定位到Content-Disposition: form-data; name="file"; filename="a.jpg"段 - 有效 payload 起始位置为
\r\n\r\n后第一个字节,结束于下一个--{boundary}前 - 将每一片写入临时文件(如
/tmp/upload_{file_id}_{chunk_index}.part),而非内存数组,便于断点续传和 Worker 重启后恢复 - 建议用
file_id+chunk_index+md5校验做幂等控制,防止重复写入或错序拼接
响应阶段注意头信息与编码
Workerman 不自动设置 Content-Type 或状态码,上传成功后需显式返回:
- 发送 JSON 响应前,务必先调用
$connection->sendHeader('Content-Type', 'application/json; charset=utf-8'); - 中文响应体要加 UTF-8 声明,否则浏览器可能按 ISO-8859-1 解析乱码
- 上传失败时,用
$connection->send("HTTP/1.1 400 Bad Request\r\n\r\nInvalid upload")显式返回状态行,避免前端收不到错误码

















