上传文件失败主因是PHP、Nginx、临时目录权限、运行值四层限制未同步放开:需修改正确php.ini中的upload_max_filesize、post_max_size、memory_limit;Nginx配置client_max_body_size;确认upload_tmp_dir可写并显式指定;最后重启服务并用phpinfo()验证生效。

phpEnv 下上传文件失败,多数不是代码问题,而是四层限制没同步放开:PHP 配置、Nginx 拦截、临时目录权限、运行时真实值未验证。改完不重启、不确认生效路径、漏掉任一环节,都会白调。
找准并修改正确的 php.ini
phpEnv 是多版本 PHP 环境管理工具,每个 PHP 版本有独立配置文件,不能乱改错位置:
- 打开你的 PHP 项目根目录,新建一个 info.php,内容为
<?php phpinfo(); ?> - 用浏览器访问该文件,在页面中查找 Loaded Configuration File 这一行,它显示的路径才是当前 Web 模式真正读取的 php.ini(例如
C:\phpenv\versions\8.2\php.ini) - 用记事本或 VS Code 打开这个文件,找到并修改以下三项(单位统一用
M,不要加空格):upload_max_filesize = 100Mpost_max_size = 105M(必须 ≥ upload_max_filesize,留出表单字段余量)memory_limit = 256M(建议 ≥ post_max_size 的 1.5 倍)
同步调整 Nginx 的 client_max_body_size
phpEnv 默认搭配 Nginx,它会在 PHP 解析前就拦截超限请求,返回 413 错误,此时 PHP 根本收不到数据:
- 打开 Nginx 配置文件,路径通常为
C:\phpenv\nginx\conf\nginx.conf或站点 conf 文件(如conf\vhost\your-site.conf) - 在
server块内(不是 http 全局块)添加一行:client_max_body_size 100M; - 保存后,在命令行执行:
nginx -t(检查语法)→ 成功再执行nginx -s reload
验证 upload_tmp_dir 是否可写
即使所有参数都调大,如果 PHP 无法把上传文件暂存到临时目录,也会静默失败($_FILES 为空或 error=6):
立即学习“PHP免费学习笔记(深入)”;
- 在任意 PHP 脚本里加这三行,运行看输出:
echo ini_get('upload_tmp_dir') . "\n";var_dump(is_writable(ini_get('upload_tmp_dir')));echo ini_get('upload_max_filesize') . "\n"; - 如果
upload_tmp_dir返回空,说明用了系统默认路径(如C:\Windows\Temp),需手动指定一个明确路径,例如:upload_tmp_dir = "C:/phpenv/tmp"(创建该文件夹,并确保 nginx 或 apache 用户有写权限) - Windows 下右键文件夹 → 属性 → 安全 → 编辑 → 添加用户
IIS_IUSRS或Users,勾选“写入”
重启服务并确认真实生效值
改完配置不重启等于没改;只看 php.ini 内容不等于它真被加载了:
- 必须重启 phpEnv 托管的 Web 服务:在 phpEnv 图形界面中点击对应站点的「重启 Apache」或「重启 Nginx」按钮;或命令行进入
C:\phpenv目录,运行phpenv restart - 再次访问
info.php,核对 Loaded Configuration File 和下方各项值是否已更新 - 注意:
ini_set()和.htaccess在 phpEnv + Nginx 场景下基本无效,别浪费时间试



















