frankenphp处理大文件上传超时需同步调整http层(read_timeout≥600s)、php层(upload_max_filesize、post_max_size、max_input_time=600、max_execution_time=600、memory_limit=1g)和运行时层(workers.timeout=0或≥1800s)三类配置,缺一不可。

FrankenPHP 处理大文件上传超时,不能只改 PHP 层参数——它虽把 Web 服务器和 PHP 运行时合为一体,但上传流程仍涉及请求接收、流式解析、临时存储、脚本执行四个环节,每环都有独立超时控制。关键是要在 FrankenPHP 的 YAML 配置中同步调整 HTTP 层、PHP 层和底层运行时三类设置。
HTTP 层:控制客户端连接与请求体接收
FrankenPHP 内置的 HTTP 服务(基于 Caddy)会主动断开慢速或长时间未完成的上传。必须显式延长以下超时:
-
read_timeout:从客户端开始发数据起,等待完整请求体到达的最大时间。建议设为
600s或更高,写在http块下 -
read_header_timeout:仅控制请求头读取时限,一般保持默认(如
10s)即可,无需调大 - 若启用了 HTTPS 或反向代理转发,还需确认
tls或reverse_proxy子配置中没有覆盖更短的超时值
PHP 层:匹配上传与执行生命周期
FrankenPHP 使用独立的 php.ini(由 php.ini_path 指定),其 PHP 参数必须成套调整,且需与 HTTP 层超时对齐:
-
upload_max_filesize 和 post_max_size:按需设为
512M或2G,注意post_max_size ≥ upload_max_filesize + 表单开销 -
max_input_time = 600:这是接收文件流的“第一道门”,必须 ≥
read_timeout,否则未等传完就被 PHP 中断 -
max_execution_time = 600:涵盖
move_uploaded_file()、校验、压缩等后续操作;若用 NFS 或慢盘,可适当再加 -
memory_limit = 1G:建议 ≥ 1.5 ×
post_max_size,避免缓冲区分配失败导致上传静默中断
FrankenPHP 运行时层:防止 worker 主动终止
FrankenPHP 的 worker 模式下,每个常驻进程会自行管理生命周期。若上传处理耗时过长,可能被内部 watchdog 强制回收:
-
workers.max_requests:不直接影响超时,但设得太小(如
100)会导致频繁重启,间接引发连接重置;建议 ≥1000 -
workers.timeout:FrankenPHP 0.10+ 版本新增参数,定义单个 worker 空闲多久后自动退出。上传中 worker 不算空闲,但若脚本卡在阻塞 I/O(如未设置 stream_set_timeout),可能被误判。建议显式设为
0(永不过期)或足够大(如1800s) - 检查日志是否出现
worker killed due to timeout类提示,这是该层超时的明确信号
额外注意事项
FrankenPHP 不经过 Nginx/FPM,所以不用管 fastcgi_read_timeout 或 request_terminate_timeout;但它仍受操作系统级限制影响:
- 确保系统
net.core.somaxconn和net.ipv4.tcp_fin_timeout未设得过严 - 若前端使用分片上传,FrankenPHP 默认支持标准 multipart 请求,无需额外开启模块,但需在路由中允许
OPTIONS预检请求 - 验证生效路径:通过
frankenphp -c /etc/frankenphp/frankenphp.yaml --debug启动并观察启动日志,确认加载的php.ini路径和各 timeout 值是否正确解析
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











