需同步修改caddy的request_body.max_size、frankenphp的upload_max_filesize和post_max_size,并重启进程;三者缺一不可,否则上传失败。

php_server 指令不控制上传限制,得改 PHP 运行时参数
FrankenPHP 的 php_server 指令只负责路由和执行 PHP 脚本,它本身不解析或限制 multipart 表单上传。真正起作用的是 PHP 内置的上传配置项,比如 upload_max_filesize 和 post_max_size。这些值默认继承自 FrankenPHP 内置 PHP 的编译默认值(通常是 2M),远低于生产环境常见需求。
修改 upload_max_filesize 必须通过 frankenphp 命令行或 YAML 配置
FrankenPHP 不读取系统级 php.ini,也不支持在 Caddyfile 里用 php_admin_value 这类指令(那是 PHP-FPM 的语法)。你只能通过以下两种方式之一生效:
- 启动时用
--php-ini参数指定自定义 ini 文件路径,例如:frankenphp run --php-ini ./php.ini - 在 YAML 配置文件(如
/etc/frankenphp/frankenphp.yaml)的php区块下设置:php: ini_path: "/path/to/custom.ini"
或直接内联:php: ini: upload_max_filesize: "50M" post_max_size: "50M" max_execution_time: 300
注意:post_max_size 必须 ≥ upload_max_filesize,否则表单提交会直接失败并返回空响应(不是 413);max_execution_time 也要同步调大,避免大文件上传中途超时中断。
Caddy 层的 request_body 限制会先于 PHP 拦截上传
Caddy 默认对请求体大小有限制(约 16MB),如果上传文件超过这个值,Caddy 会在 PHP 执行前就返回 413 Request Entity Too Large。必须显式在 Caddyfile 的站点块中增加 request_body 指令:
yourdomain.com {
encode zstd br gzip
request_body {
max_size 50MB
}
php_server {
try_files {path} index.php
}
}
这个 max_size 值应略大于你设的 upload_max_filesize(比如设 50MB 对应 PHP 的 48MB),留出 multipart boundary 和其他字段的空间。漏掉这一步,哪怕 PHP 配置再大也根本进不到脚本里。
worker 模式下修改需重启,且不能热重载 ini
FrankenPHP 的 worker 模式会让 PHP 进程常驻内存,所有 ini 设置只在进程启动时读取一次。改完 php.ini 或 YAML 后,必须完整重启 frankenphp 进程才能生效——SIGHUP 或 Caddy 的 config reload 不会重新加载 PHP 配置。这也是最容易被忽略的一点:你以为 reload 了 Caddyfile 就生效,其实 PHP 层还是旧的限制。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











