frankenphp 默认上传限制由 php 内置配置决定,即 upload_max_filesize(默认2m)和 post_max_size(默认8m);需通过 frankenphp { php_ini ... } 或自定义 php.ini 修改,且 post_max_size 必须 ≥ upload_max_filesize。

FrankenPHP 默认上传限制在哪?
FrankenPHP 本身不直接控制 PHP 的上传大小,它继承的是内置 PHP 运行时的默认配置。所以你看到的 4M 或 2M 限制,实际来自 PHP 内置的 upload_max_filesize 和 post_max_size,不是 Caddy 或 FrankenPHP 自己设的“网关级”限制。
Caddyfile 里不能调上传大小
别在 Caddyfile 的 php_server 块或 request_body { max_size ... } 里改——那个只管整个 HTTP 请求体(比如 JSON body),对 multipart/form-data 文件上传不起作用。它拦得住超大的纯 POST 数据,但拦不住 PHP 已经接收、正在解析的文件字段。
-
request_body { max_size 10MB }是 Caddy 层的“总请求体上限”,但它发生在 PHP 解析前;一旦 PHP 开始读$_FILES,就已绕过这个检查 - 真正卡住上传的,是 PHP 自己在解析 multipart 时校验
upload_max_filesize和post_max_size - 所以即使你把
request_body放到 100MB,PHP 仍会返回UPLOAD_ERR_INI_SIZE错误
必须改 PHP 配置项
FrankenPHP 提供了两种改法,优先用第一种:
- 在
Caddyfile全局块里用frankenphp { php_ini ... }直接覆盖:{ frankenphp { php_ini upload_max_filesize 64M php_ini post_max_size 64M php_ini max_execution_time 300 } } - 如果用 Docker,也可以挂载自定义
php.ini:COPY custom-php.ini /usr/local/etc/php/conf.d/99-upload.ini,内容写两行:upload_max_filesize = 64Mpost_max_size = 64M - 注意:两个值都要设,且
post_max_size必须 ≥upload_max_filesize,否则表单提交直接失败
还要检查 Laravel/Symfony 框架层
PHP 层放开后,框架可能自己再拦一次。比如 Laravel 的 ValidateRequest 里写了 'file' => 'max:4096',或者用了 request()->file()->getSize() 手动判断——这些得同步改代码或验证规则。
另外,memory_limit 如果太小(比如默认 128M),大文件上传时 PHP 解析 multipart 临时内存不够,也会静默失败。建议一并调高:php_ini memory_limit 256M。
最容易被忽略的是:FrankenPHP 的 php_ini 设置只影响 PHP 运行时,不改变 CLI 模式下的配置。所以 frankenphp php-cli -i | grep upload 看到的值,和 Web 请求实际生效的值可能不同——得用 phpinfo() 页面确认。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











