PHP文件上传失败主因是post_max_size配置不当,需确认其与upload_max_filesize、memory_limit协同生效,并确保修改的是phpinfo()显示的正确php.ini路径,且Apache已彻底重启。

Win7 下 PHP 文件上传失败、表单提交被截断,90% 是因为 post_max_size 没调或调错了位置——它不是“调大就完事”,而是必须和 upload_max_filesize、memory_limit 协同生效,且配置文件路径、BOM、重启方式全会影响结果。
为什么改了 post_max_size 还没用?
Win7 系统下 Apache 或 CLI 启动后会固化加载的 php.ini 路径,你编辑的很可能根本不是它读的那个文件。常见误操作包括:
- 在 PHP 安装目录下改了
php.ini-production,但 Apache 实际读的是PHPIniDir指定路径下的另一个php.ini - 用记事本保存时加了 UTF-8 BOM(尤其 Win7 自带记事本默认行为),导致 PHP 解析失败,静默忽略整个配置文件
- 修改后只重启了浏览器或 CMD,没真正重启 Apache 服务(
httpd -k restart或 phpStudy 界面点“重启”) - 改的是 CLI 模式下的
php.ini(如php -i | findstr "Loaded Configuration File"查到的路径),但 Web 请求走的是 Apache 加载的另一份
确认当前生效的 php.ini 路径
别猜,直接查。在 Web 目录下建一个 info.php,内容为:
<?php phpinfo(); ?>
访问 http://localhost/info.php,搜索 Loaded Configuration File —— 显示的路径才是你该改的那一个。重点看它是否指向你预期的位置,比如 C:/php/php74/php.ini 或 D:/phpstudy/PHPTutorial/php/php-7.3.4n/php.ini。
立即学习“PHP免费学习笔记(深入)”;
如果显示 none,说明 Apache 根本没加载任何 php.ini,此时 post_max_size 必然无效,需检查 httpd.conf 中是否有正确 PHPIniDir 指令,且路径无中文、空格、反斜杠。
post_max_size 必须配合的三个参数
单独调大 post_max_size 没意义,这三个值必须满足: post_max_size ≥ upload_max_filesize,且都 ≤ memory_limit。否则上传中途会被 PHP 强制终止。
-
post_max_size = 64M:限制整个 POST 请求体大小(含文件 + 表单字段) -
upload_max_filesize = 32M:单个上传文件上限,必须 ≤post_max_size -
memory_limit = 128M:PHP 进程内存上限,必须 ≥post_max_size(否则解析 POST 数据时 OOM) - 注意单位写法:
64M可以,64MB或67108864(字节)也行,但不能写64 MB(空格报错)
Win7 下最容易被忽略的细节
Win7 的文件权限和路径敏感性比新系统高得多,以下三点不处理,改对了参数也白搭:
-
session.save_path和upload_tmp_dir必须指向真实存在的、Apache 进程有写权限的目录(如D:/phpsessiontmp),不能是C:/Windows/Temp(UAC 限制) - 如果使用 phpStudy,它的 Apache 服务是以 LocalSystem 身份运行的,但该账户默认无法写入用户目录(如
C:/Users/xxx/),务必把临时目录建在D:/根下 - 改完
php.ini后,必须用sc query Apache2.4确认服务状态是RUNNING,再执行phpStudy\PHPTutorial\Apache\bin\httpd -t验证配置语法,最后手动httpd -k restart或点界面按钮——仅靠任务栏图标“重启”有时不彻底
Win7 下最稳妥的做法:所有路径用正斜杠、全英文、无空格;所有 ini 值单位紧贴数字;所有临时目录手动创建并右键属性 → 安全 → 编辑 → 添加 Everyone 写入权限。这些不是“过度防护”,而是 Win7 的实际运行约束。



















