php在phpenv中修改upload_tmp_dir需同步创建目录、设对权限(如iis_iusrs)、禁用符号链接并重启php-cgi进程,否则move_uploaded_file()将静默失败;路径须为绝对英文路径,通过phpinfo()确认实际加载的php.ini及生效值。

phpEnv 下修改 upload_tmp_dir 不能只改配置,必须同步创建目录、设对用户、禁用符号链接、重启 PHP-CGI 进程 —— 否则上传会静默失败,move_uploaded_file() 返回 false 且无错误提示。
确认当前生效的 upload_tmp_dir 路径
phpEnv 是 Windows 下轻量级 PHP 环境(类似 XAMPP),但不走 Apache 模块,而是以 CGI 方式运行 PHP,因此 phpinfo() 中的 upload_tmp_dir 值才真正有效,不能依赖系统默认路径(如 C:\Windows\Temp)。
- 在网站根目录建
info.php,内容为<?php phpinfo(); ?>,浏览器访问后搜索upload_tmp_dir行 - 若显示为空或
no value,说明未显式配置,PHP 将退回到 CGI 进程启动用户的临时目录,该路径往往不可写或被杀毒软件拦截 - 不要用
ini_get('upload_tmp_dir')判断 —— 它在 CGI 模式下可能返回缓存旧值
在 phpEnv 的 php.ini 中设置并验证路径
phpEnv 的主配置文件通常位于 C:\phpenv\php\php.ini(具体路径以你安装位置为准),修改前务必确认这是当前 CGI 实际加载的文件(通过 phpinfo() 页面顶部的 Loaded Configuration File 行核对)。
- 取消注释并设置:
upload_tmp_dir = "C:\phpenv\tmp"(必须用英文双引号包裹,反斜杠无需转义) - 路径必须是**绝对路径**,不能含变量(如
%TEMP%)或环境扩展 - 该路径不能是符号链接 —— phpEnv + CGI 模式下遇到软链接会直接拒绝写入,报错不明显
- 保存后不要仅刷新网页,需彻底退出 phpEnv 托盘程序再重开,否则 CGI 进程不会重新读取 php.ini
创建目录并授予 IIS_IUSRS 或 Users 组权限
phpEnv 在 Windows 上默认以当前登录用户身份运行 CGI,但实际写入行为常由 IIS_IUSRS(IIS 衍生)或 Users 组触发,尤其当使用 Nginx + php-cgi.bat 启动时。直接给 Everyone 777 权限是危险且无效的。
- 手动创建目录:
mkdir C:\phpenv\tmp - 以管理员身份打开命令提示符,执行:
icacls "C:\phpenv\tmp" /grant "IIS_IUSRS:(OI)(CI)F" /T - 若未启用 IIS 组件,改授
Users组:icacls "C:\phpenv\tmp" /grant "Users:(OI)(CI)F" /T - 避免使用图形界面“安全”选项卡点选 —— 它容易漏掉
(OI)(对象继承)和(CI)(容器继承),导致子文件无权限
为什么改了 php.ini 还是上传失败?常见硬坑
phpEnv 的 CGI 模式对临时目录更敏感,几个隐蔽但高频的问题会导致上传卡在 $_FILES['x']['tmp_name'] 为空或 move_uploaded_file() 失败:
-
upload_tmp_dir路径跨磁盘(如从C:指向D:\temp):某些 Windows 版本 + CGI 组合下会触发 ACL 重置,必须同盘符 - 杀毒软件(尤其是 Windows Defender 实时防护)拦截
php-cgi.exe对tmp目录的写入,临时关闭防护测试可快速定位 - 目录名含空格或中文(如
C:\php env\tmp):CGI 解析路径时易出错,坚持用纯英文无空格路径 - 没关掉 phpEnv 自带的“自动清理临时文件”开关(部分版本托盘右键菜单里有):它可能在上传中途删掉正在写的临时文件
最稳妥的做法是:路径用 C:\phpenv\tmp、权限用 icacls 命令赋权、重启整个 phpEnv、再用最小化脚本测试 —— 复杂性不在配置本身,而在 Windows 权限模型与 CGI 生命周期的耦合。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











