PHP上传失败需同步调整upload_max_filesize、post_max_size、client_max_body_size和memory_limit四项配置,缺一不可;改完后须重启Web服务,并通过ini_get()和is_writable()验证运行时真实值与临时目录权限。

PHP上传文件失败,不是代码写错了,而是上传大小被层层卡住——upload_max_filesize、post_max_size、client_max_body_size、memory_limit,四个配置缺一不可,改错一个就白调。
怎么确认当前生效的上传限制值
别猜,直接看运行时真实值。在任意 PHP 脚本里加这三行:
echo ini_get('upload_max_filesize') . "\n";
echo ini_get('post_max_size') . "\n";
echo ini_get('memory_limit') . "\n";
注意:ini_get() 返回的是字符串(如 "2M"),不是字节数;还要检查 upload_tmp_dir 是否可写,用 is_writable(ini_get('upload_tmp_dir')) 验证,否则即使参数全调大,也会静默失败。
phpEnv 环境下改 php.ini 的关键操作点
phpEnv 是 Windows 下的多版本 PHP 环境管理工具,它的 php.ini 文件路径不固定,通常位于:
立即学习“PHP免费学习笔记(深入)”;
-
C:\phpenv\versions\{version}\php.ini(主配置) - 或
C:\phpenv\versions\{version}\php-cli.ini(CLI 模式用,Web 不读这个)
必须改对那个被 Web 服务器加载的 php.ini。打开你的 PHPinfo 页面,找 Loaded Configuration File 行,以它为准。改完后不用重启系统,但要重启 phpEnv 托管的 Web 服务(比如 Apache 或 Nginx),否则不生效。
为什么改了 upload_max_filesize 还是上传失败
常见原因有三个:
-
post_max_size小于upload_max_filesize:POST 请求总容量不够,文件+表单字段一起超限,必须满足post_max_size >= upload_max_filesize - Nginx 层拦截:phpEnv 若搭配 Nginx,必须同步改
client_max_body_size,位置在nginx.conf的http或server块里,例如client_max_body_size 100M; -
memory_limit不足:PHP 处理上传文件时会把整个 POST 内容载入内存,建议设为post_max_size的 1.5 倍以上,比如post_max_size = 100M时,memory_limit = 160M
漏掉任意一项,$_FILES['xxx']['error'] 都会返回 1(UPLOAD_ERR_INI_SIZE)或 2(UPLOAD_ERR_FORM_SIZE),而不是抛异常,容易误判。
哪些修改方式在 phpEnv 下基本无效
以下方法在 phpEnv 的典型部署中大概率不起作用:
-
ini_set('upload_max_filesize', '100M'):PHP 启动后不能动态修改该指令,调用无效果,ini_set()返回false -
.htaccess:仅适用于 Apache + mod_php,phpEnv 默认用 Nginx 或 CLI 模式,且多数不启用AllowOverride,写了也忽略 - 只改
php-cli.ini:CLI 模式配置不影响 Web 请求,完全无关
真正起效的只有改对的 php.ini + 对应 Web 服务器配置 + 重启对应服务。临时测试可以先用小值(如 8M)验证流程是否通,再逐步放大,避免一步到位却卡在某个隐藏环节。



















