FrankenPHP大文件上传超时由Caddy层(client_max_body_size、timeout_idle、timeout_read)和PHP层(upload_max_filesize、post_max_size)共同控制,漏配任一参数均会导致静默失败。

FrankenPHP里哪些参数真正影响大文件上传超时
FrankenPHP 没有 max_execution_time 这类传统 PHP-FPM 的全局超时开关,它的超时控制分散在 Caddy 层和 PHP 运行时两处。直接改 php.ini 里的 max_execution_time 或 max_input_time 在 FrankenPHP 下基本无效——因为请求根本不会走 PHP-FPM 的 timeout 逻辑。
Caddyfile 中必须配的 client_max_body_size 和 timeouts
FrankenPHP 把 Caddy 当成 HTTP 入口,所有上传限制都从 Caddy 配置生效:
-
client_max_body_size必须显式设置,否则默认是 1MB,上传稍大文件就直接返回 413;示例:client_max_body_size 2G -
timeout_idle控制连接空闲超时,大文件上传期间若网络抖动、客户端暂停发送,这个值太小会断连;建议设为600s或更高 -
timeout_read影响从客户端读取完整 body 的总耗时,上传 1GB 文件走千兆内网也要几秒,设太低(如默认 5s)会直接中断;推荐timeout_read 600s - 如果用了
reverse_proxy转发到其他服务,还得单独配transport http { read_timeout 600s }
PHP 层仍需调的 upload_max_filesize 和 post_max_size
虽然 FrankenPHP 不依赖 PHP-FPM,但它仍用标准 PHP SAPI 解析 multipart 请求,所以 upload_max_filesize 和 post_max_size 依然起作用:
- 二者必须同时调整,且
post_max_size≥upload_max_filesize,否则$_FILES为空 - FrankenPHP 启动时会加载系统 php.ini,但如果你用的是自定义 php.ini 路径(比如通过
php_config指定),要确认该文件里这两个值已生效 - 别碰
memory_limit来“撑”大文件上传——它不决定上传能力,只影响后续处理;盲目调高反而掩盖真实内存泄漏
Laravel 自身的验证和中间件可能悄悄截断请求
即使 Caddy 和 PHP 层都放行了,Laravel 的 ValidatePostSize 中间件或表单验证规则仍可能报错:
立即学习“PHP免费学习笔记(深入)”;
- 检查是否启用了
App\Http\Middleware\ValidatePostSize(Laravel 10+ 默认启用),它会在请求进入控制器前校验Content-Length,超限直接 413 - 若使用
request()->validate(['file' => 'required|file|max:204800']),注意单位是 KB,max:204800是 200MB,写错会误判 - 前端若用
FormData提交,Nginx 或 Caddy 可能因 multipart 解析行为差异导致分片丢失,建议大文件上传改用fetch+ArrayBuffer直传二进制流
FrankenPHP 的优势在于链路缩短,但这也意味着超时不再由多层配置“兜底”,而是集中在 Caddyfile 和 PHP SAPI 两级。漏掉其中任意一个 timeout 设置,上传就会在某个环节静默失败,日志里往往只留一条 “connection reset” 或空响应。



















