FrankenPHP 上传大小限制由 php.ini 的 upload_max_filesize、post_max_size 和 memory_limit 三项共同控制,修改后需重启进程并验证生效。

FrankenPHP 是基于 PHP 的现代运行时,它用 Go 编写,不依赖传统 Web 服务器(如 Apache 或 Nginx),而是直接处理 HTTP 请求。但它仍沿用标准 PHP 配置机制,上传大小限制依然由 php.ini 中的参数控制,只是生效方式和重启逻辑略有不同。
你不能像在 Apache/Nginx 环境中那样“重启 Web 服务”,因为 FrankenPHP 自身就是 PHP 运行时 —— 修改配置后需重启 FrankenPHP 进程,且要确保加载的是你修改的 php.ini 文件。
✅ 必须同步调整的三个核心参数(缺一不可)
在 php.ini 中找到并修改以下三项(单位用 M,不加引号,不带空格):
upload_max_filesize = 100M
单个文件最大允许上传大小(例如:你要传一个 80MB 的视频,这个值必须 ≥ 80M)post_max_size = 105M
整个 POST 请求体上限(含文件 + 表单字段等),必须严格 ≥upload_max_filesize,建议多留 5–10% 缓冲memory_limit = 256M
脚本可用内存,应 ≥post_max_size(推荐设为post_max_size的 1.5–2 倍),否则解析大 POST 时会因内存不足失败
⚠️ 常见失败原因:只改了
upload_max_filesize,但post_max_size还是默认的8M,导致$_FILES为空、无错误提示或返回 413。立即学习“PHP免费学习笔记(深入)”;
✅ 确认 php.ini 路径并编辑
FrankenPHP 启动时会加载默认的 php.ini,路径取决于你的安装方式:
- 如果用
frankenphp serve启动(开发模式),它通常读取系统默认 PHP 的php.ini(可通过php --ini查看) - 如果用
frankenphp webserver或自定义frankenphp.yaml,可在配置中显式指定:php: ini_path: "/path/to/your/php.ini"
✅ 推荐做法:
新建一个测试脚本 info.php,内容为 <?php phpinfo(); ?>,访问后查看 “Loaded Configuration File” 对应路径,确认你编辑的是这个文件。
✅ 其他建议调整项(提升大文件稳定性)
| 参数 | 推荐值 | 说明 |
|---|---|---|
max_execution_time |
300 或 0(不限制) |
防止上传中途因超时中断(尤其网络慢或文件大) |
max_input_time |
300 |
控制 POST 数据解析耗时,应 ≥ max_execution_time
|
file_uploads |
On |
确保上传功能未被禁用(检查是否意外设为 Off) |
upload_tmp_dir |
显式指定可写目录,如 /tmp/frankenphp-uploads
|
避免因系统 /tmp 权限或空间不足导致 “unable to create a temporary file” 错误 |
? 提示:FrankenPHP 默认使用系统临时目录,若部署在容器或受限环境,务必检查该目录是否存在且可写。
✅ 修改后生效方式
FrankenPHP 不会自动热重载 php.ini。你必须:
- 停止当前 FrankenPHP 进程(
Ctrl+C或kill) - 确保没有残留子进程(如
ps aux | grep frankenphp) - 重新运行启动命令(如
frankenphp serve或frankenphp webserver)
✅ 验证是否生效:再次访问 info.php,搜索 upload_max_filesize 和 post_max_size,确认值已更新。
❗ 特别注意:FrankenPHP 不受 Nginx/Apache 限制,但受 Go HTTP 层影响
FrankenPHP 内置 HTTP 服务器基于 Go 的 net/http,它本身没有类似 client_max_body_size 的硬性限制 —— 它把请求体完整交给 PHP 引擎处理,因此只要 PHP 层配置正确,就能支持大文件。
但如果你在 FrankenPHP 前面反向代理了 Nginx(比如生产环境用 Nginx → FrankenPHP),那 Nginx 的 client_max_body_size 也必须同步调大,否则请求会在代理层就被拒绝。
不复杂但容易忽略。改完 php.ini 三个值、指定好临时目录、重启进程、再验证,基本就跑通了。



















