php大文件上传超时需同步调整php(upload_max_filesize、post_max_size、max_execution_time、max_input_time、memory_limit)、nginx(client_max_body_size、client_body_timeout、fastcgi_read_timeout)、php-fpm(request_terminate_timeout)及upload_tmp_dir权限与路径,缺一不可。

PHP 7.4上传或下载大文件时出现超时错误,不是改一个参数就能解决的,而是多层限制共同作用的结果。关键要同步调整 PHP 层、Web 服务器层(Nginx/Apache)、以及 PHP-FPM 层的超时与大小配置,缺一不可。
PHP 层核心参数必须一起调
仅改 max_execution_time 很可能无效,因为上传/下载流程涉及多个阶段:
-
upload_max_filesize:控制单个上传文件最大体积(如
512M) -
post_max_size:必须 ≥ upload_max_filesize + 表单其他字段开销(建议设为同值或略大,如
520M) -
max_execution_time:脚本总运行时间,含文件移动、压缩、校验等(建议
600秒) -
max_input_time:接收整个请求体(含文件流)的最长时间,常被忽略但很关键(也设为
600) -
memory_limit:需足够容纳临时缓冲,建议 ≥ 1.5 × post_max_size(如
1G)
修改位置:确认实际生效的 php.ini(用 phpinfo() 查 “Loaded Configuration File”),保存后必须重启 php7.4-fpm 和 Web 服务。
Nginx 层拦截必须解除
Nginx 在请求到达 PHP 前就可能拒绝大请求,光调 PHP 没用:
-
client_max_body_size:设为 ≥ PHP 的
post_max_size(如512M),加在server或location ~ \.php$块内 -
client_body_timeout:防慢速上传中断,建议
600 -
fastcgi_read_timeout(Nginx + PHP-FPM 场景):必须 ≥ PHP 的
max_execution_time,否则 Nginx 主动断连 - 若经 CDN 或负载均衡(如 Cloudflare 免费版限 100 秒),需额外处理或绕过
PHP-FPM 和临时目录不能漏
FPM 进程自身也会强制终止长请求:
- 编辑
/etc/php/7.4/fpm/pool.d/www.conf,确保:request_terminate_timeout = 600s(必须 ≥ max_execution_time)request_slowlog_timeout = 300s(可选,便于排查卡点) -
upload_tmp_dir:显式指定可写、有空间、不被自动清理的路径(如
/var/www/uploads/tmp),避免move_uploaded_file()静默失败 - 检查该目录权限:
chown www-data:www-data /var/www/uploads/tmp,并确认磁盘空间充足
下载场景要换流式输出
直接 readfile() 大文件易触发内存溢出或超时,应采用分块流式输出:
- 禁用输出缓冲:
ob_end_clean(); - 设置响应头:
Content-Type、Content-Length、Content-Disposition - 用
fopen() + fread() + echo + flush()分批读写,每次 1–2MB - 避免把整个文件读进内存;如需加权限校验,放在流式输出前完成即可
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











