PHP 文件上传需同步调整 PHP 的 upload_max_filesize、post_max_size 和 max_execution_time 三个参数,并配置 Nginx 的 client_max_body_size 或 Apache 的 .htaccess,否则仍会因任一环节限制导致 413 错误或上传中断。

PHP 动态网站上传文件大小受限,不是单靠改一个配置就能生效的,必须同时调整 PHP 层和 Web 服务器层的多个参数,否则会出现“明明改了 upload_max_filesize 却还是传不过 2MB”的情况。
PHP 配置项必须同步修改的三个关键参数
只改 upload_max_filesize 是无效的。它只控制单个文件上限,但还受另外两个参数制约:
-
post_max_size:必须 ≥upload_max_filesize,否则整个 POST 请求(含文件+表单字段)会被截断,报错通常是“413 Request Entity Too Large”或 PHP 返回空$_FILES -
max_execution_time和max_input_time:大文件上传耗时长,超时会导致中断,建议设为300或更高(单位秒) - 若用
ini_set()在脚本里动态设置,仅对当前请求生效,且不适用于已启动的上传(PHP 启动时就读取 ini 值),所以必须改php.ini或.htaccess(Apache)/php_admin_value(Nginx + php-fpm)
Nginx 下上传限制的绕不过去的两处配置
Nginx 默认限制客户端请求体大小为 1MB,即使 PHP 全放开,也会在 Nginx 层直接返回 413 Request Entity Too Large:
- 必须在
server或location块中显式设置client_max_body_size,例如:client_max_body_size 50M;
- 该值要 ≥ PHP 的
post_max_size,否则 Nginx 拦截后根本不会把请求发给 PHP - 改完需重载 Nginx:
sudo nginx -s reload,不是 restart
Apache 用户注意 .htaccess 的权限与写法
如果不能改主配置,可用 .htaccess 覆盖部分 PHP 设置,但有前提:
程序采用ASP+ACCESS开发完成。中英繁三语言,所有页面采用UTF-8全球通用编码,兼容简体中文、繁体中文及英语,适用于中小企业网站运用。后台数据同时录入中文及英文,繁体采用JS自动转换,无需维护。免费版主要功能如下:·系统管理:系统综合设置、管理员管理、数据库备份、上传文件管理。·单页管理:自由无限制添加个性页面,如:公司简介、组织结构、联系我们等
立即学习“PHP免费学习笔记(深入)”;
- Apache 必须启用
AllowOverride All或至少包含Options和FileInfo - 写法是:
php_value upload_max_filesize 50M
php_value post_max_size 52M
php_value max_execution_time 300 - 注意:
php_value不支持在 CGI/FastCGI 模式下使用(常见于共享主机),此时会 500 错误;必须确认 PHP 运行模式(用php_sapi_name()查)
真正卡住上传的往往不是 PHP 本身,而是 Nginx/Apache 的请求体拦截、反向代理超时(如 Cloudflare 默认 100MB 但有 100 秒超时)、甚至浏览器自身对长连接的处理。调大参数后务必验证整条链路——从浏览器选择文件、到 Nginx 接收、PHP 解析、再到你代码里的 $_FILES 是否完整,缺一不可。










