frankenphp 1.2 文件上传大小需同步配置四点:1. sapi 层设 max_memory_upload(如32m);2. php 层调 upload_max_filesize、post_max_size 等;3. 显式配置 upload_tmp_dir 并确保可写;4. 反向代理层(nginx/caddy)设 client_max_body_size 或 body_limit。

FrankenPHP 1.2 文件上传大小限制不是单一参数能控制的,而是由 SAPI 层、PHP 内核层、反向代理层 三处共同决定。调小会直接报错(如 413 或 $_FILES 为空),调大会引发内存溢出(OOM)。必须同步配置以下四点才真正生效。
明确设置 max_memory_upload(FrankenPHP 特有关键项)
这是 FrankenPHP 自定义的 SAPI 参数,不是 php.ini 标准项,默认仅约 2MB。它决定“多大以内的文件走内存”,超限才落盘。若不设,上传稍大文件(如 3MB)就全驻内存,多并发极易 OOM。
- CLI 启动时指定:
frankenphp run --max-memory-upload=32M
- Caddyfile 中配置(在
php_server块内):php_server { max_memory_upload 32M } - Docker 环境变量方式(适用于
dunglas/frankenphp镜像):environment: - FRANKENPHP_MAX_MEMORY_UPLOAD=32M
建议值:设为略高于你允许的最大单文件尺寸(例如支持传 20MB 视频,就设
32M),留出 multipart 边界和元数据空间。避免设512M等过大值——并发上传时 RSS 内存会线性飙升,触发 OOM Killer 杀进程。
调整 PHP 层上传上限(php.ini 必配项)
这些是标准 PHP 配置,FrankenPHP 完全遵循:
-
file_uploads = On(必须开启,否则$_FILES恒为空) upload_max_filesize = 32M-
post_max_size = 48M(需 ≥upload_max_filesize,建议留 16M 余量,因 multipart 包含字段、边界等额外开销) -
max_file_uploads = 20(单次请求最多上传几个文件)
修改后务必重启 FrankenPHP(frankenphp stop && frankenphp start 或 systemctl restart frankenphp),并用 frankenphp phpinfo 确认实际加载的 php.ini 路径和值是否生效。
配置并验证 upload_tmp_dir(生产环境强制要求)
FrankenPHP 不继承系统 /tmp 的宽松权限,尤其在容器、systemd 或 SELinux 环境下,www-data 用户常无权写入默认临时目录,导致静默失败($_FILES 为空或 move_uploaded_file() 报 “Failed to write to temporary directory”)。
- 在
php.ini中显式声明:upload_tmp_dir = "/var/tmp/frankenphp-upload"
- 创建目录并赋权(以
www-data用户为例):sudo mkdir -p /var/tmp/frankenphp-upload sudo chown www-data:www-data /var/tmp/frankenphp-upload sudo chmod 755 /var/tmp/frankenphp-upload
- 容器部署时确保挂载且可写:
volumes: - "/host/tmp:/var/tmp/frankenphp-upload:rw"
- 在 PHP 脚本中验证:
var_dump(ini_get('upload_tmp_dir')); // 应输出你设的路径 var_dump(is_writable(ini_get('upload_tmp_dir'))); // 必须为 true
检查反向代理层限制(Nginx / Caddy)
FrankenPHP 常跑在 Nginx 或 Caddy 后面,它们会在请求进入 FrankenPHP 前就拦截超大 body:
- Nginx:在转发到 FrankenPHP 的
location块中加:location @frankenphp { client_max_body_size 50M; # 其他 proxy_pass / proxy_set_header ... } - Caddy(Caddyfile):
handle @php { php_server body_limit 50mb }
⚠️ 注意:不能只改
http或server块全局配置,必须确保该指令出现在实际处理请求的location或handle块内,否则不生效。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











