核心原因是PHP进程无权在临时目录读写,修复需三步闭环:确认实际临时路径→确保路径存在且www-data用户具wx权限→验证upload_tmp_dir配置生效;额外排查SELinux、磁盘空间及open_basedir限制。

PHP 文件上传失败,提示“无法创建临时文件”或“Missing a temporary folder”,核心原因只有一个:PHP 进程没有权限在指定的临时目录中读写。这不是代码问题,而是系统级配置与权限协同失效的结果。修复需三步闭环:确认实际使用的临时路径 → 确保该路径存在且可写 → 验证 PHP 配置已生效。
一、定位 PHP 当前使用的临时目录
不要猜测,直接查真实值:
- 新建一个
tmpcheck.php,内容为:<?php echo sys_get_temp_dir(); ?>,通过浏览器访问,记录输出路径(如/var/tmp或/tmp) - 同时运行
php -i | grep "upload_tmp_dir",看 php.ini 中是否显式设置了upload_tmp_dir;若为空或显示no value,则 PHP 默认使用系统级临时目录(通常是/tmp) - 注意:
sys_get_temp_dir()返回的是 PHP 实际生效的路径,优先以它为准
二、确保临时目录存在且权限正确
路径存在 ≠ 可写。必须由 PHP 进程用户(如 www-data、apache 或 nginx)拥有写入和执行(wx)权限:
- 若目录不存在,先创建:
sudo mkdir -p /var/tmp(以实际路径为准) - 设置属主和属组:
sudo chown www-data:www-data /var/tmp(请替换为你的 Web 用户名) - 设置安全权限:
sudo chmod 755 /var/tmp(drwxr-xr-x即可,777是高危操作,生产环境禁用) - 验证是否生效:
sudo -u www-data touch /var/tmp/test_write && echo "OK" || echo "FAIL"
三、检查并启用 upload_tmp_dir 配置(可选但推荐)
显式指定临时目录可避免系统路径冲突,尤其在多 PHP 版本或容器环境中:
立即学习“PHP免费学习笔记(深入)”;
- 打开 php.ini(用
php --ini查找准确路径),搜索upload_tmp_dir - 取消注释(删掉前面的分号),设为已验证可写的路径:
upload_tmp_dir = "/var/tmp" - 保存后重启 Web 服务:
sudo systemctl restart apache2或sudo systemctl restart php-fpm - 再次访问
phpinfo(),确认upload_tmp_dir行显示你设置的路径,且状态为local value和master value一致
四、额外排查项(常见漏点)
如果以上步骤都正常仍报错,请快速核对:
-
SELinux(仅 CentOS/RHEL/AlmaLinux):临时关闭测试
sudo setenforce 0;若恢复成功,需永久放行:sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/tmp(/.*)?" && sudo restorecon -Rv /var/tmp -
磁盘空间:运行
df -h /tmp或df -h /var/tmp,确保剩余空间 ≥ 最大单文件上传体积 -
open_basedir 限制:在 phpinfo() 中查看该项,若其值不为空且未包含你的临时目录路径,需在 php.ini 中追加,例如:
open_basedir = "/var/www/:/tmp:/var/tmp"



















