必须先确认实际加载的php.ini路径:Web端建info.php运行phpinfo()查“Loaded Configuration File”,命令行用php --ini,再执行echo ini_get('upload_tmp_dir')验证是否为空。

PHP 8.2 的上传临时目录必须显式配置 upload_tmp_dir,否则会 fallback 到系统默认路径(如 /tmp 或 C:WindowsTemp),极易因权限、杀软拦截或磁盘空间不足导致 move_uploaded_file() 静默失败。
怎么确认 PHP 8.2 实际加载的 php.ini
别猜路径,直接查——这是所有后续操作的前提。PHP 8.2 不会读你随手改的 php.ini-development 或桌面文件夹里的副本。
- 在 Web 环境下:建一个
info.php,内容为<?php phpinfo(); ?>,浏览器访问后搜索Loaded Configuration File,看到的才是真路径(例如C:phpenversionsphp-8.2-x64php.ini或/etc/php/8.2/fpm/php.ini) - 在命令行下:运行
php --ini,看 “Loaded configuration file” 行 - 用代码验证:
echo ini_get('upload_tmp_dir');返回空字符串,说明还没生效或压根没配
改 php.ini 的 upload_tmp_dir 必须满足四个硬条件
只写一行 upload_tmp_dir = /your/path 远不够。漏掉任一条件,$_FILES['x']['tmp_name'] 就是空的,且不报错。
- 路径必须是**绝对路径**,不能含
%TEMP%、~、./或环境变量;末尾**不能加斜杠**(/var/tmp/❌,/var/tmp✅) - 目录必须**手动创建**,PHP 不会自动建;Linux 下用
mkdir -p /var/tmp/php82,Windows 下用资源管理器新建C:php82temp - 目录权限必须匹配 PHP 进程用户:Linux 上
chown www-data:www-data /var/tmp/php82 && chmod 755 /var/tmp/php82;Windows 上右键目录 → 安全 → 给IIS_IUSRS(IIS)或Users(phpEnv)赋予“写入”和“修改”权限 - 禁用杀毒软件实时监控该目录(尤其 Windows 下的 360、火绒常静默拦截);SELinux/AppArmor 用户需额外放行上下文(如
semanage fcontext -a -t httpd_tmp_t "/var/tmp/php82(/.*)?")
为什么 ini_set('upload_tmp_dir', ...) 一定无效
这是 PHP 的底层限制:upload_tmp_dir 属于 PHP_INI_SYSTEM 级别配置项,只能在启动时由 php.ini、Apache 的 php_admin_value 或 PHP-FPM pool 的 php_admin_value[upload_tmp_dir] 设置。运行时调用 ini_set() 完全被忽略,连警告都不会抛。
立即学习“PHP免费学习笔记(深入)”;
- 常见误操作:在
upload.php开头写ini_set('upload_tmp_dir', '/tmp/myapp');—— 没用 - 正确做法:若用 PHP-FPM,编辑对应 pool 文件(如
/etc/php/8.2/fpm/pool.d/www.conf),加一行php_admin_value[upload_tmp_dir] = /var/tmp/php82,然后systemctl restart php8.2-fpm - 宝塔或 phpEnv 用户:必须进控制面板点「重启 PHP」,仅重启 Nginx/Apache 不生效
upload_tmp_dir 和 sys_temp_dir 是两回事
别混淆。前者只管 $_FILES 上传中转;后者影响 tempnam()、sys_get_temp_dir() 和部分扩展缓存。PHP 8.2 允许两者不同路径,也建议分离:
-
upload_tmp_dir = /var/tmp/php82_uploads(专注上传,权限收紧) -
sys_temp_dir = /var/tmp/php82_sys(供内部函数用,可更宽松) - 两者都得手动建目录、赋权限;
sys_temp_dir不设也不会让上传挂掉,但某些图像处理或 ZIP 解压可能出错
最易被忽略的一点:Windows 下路径分隔符必须用正斜杠 / 或双反斜杠 \,单反斜杠 会导致 MySQL(如果共用目录)或 PHP 解析失败,且错误不明确。



















