PHP中upload_tmp_dir设置被忽略问题求助
你大概率是踩了PHP-FPM配置优先级的坑,我帮你梳理几个最容易遗漏的关键点:
PHP-FPM Pool配置的强制覆盖(最常见原因)
PHP-FPM的pool配置文件(通常是/etc/php/7.x/fpm/pool.d/www.conf,具体路径看你的系统)里,如果设置了php_admin_value[upload_tmp_dir] = /tmp,这个配置的优先级是最高的——它会直接覆盖你在vhost、php.ini甚至脚本里用ini_set()设置的值。哪怕你的调试代码显示ini_get('upload_tmp_dir')返回了新目录,实际运行时PHP-FPM还是会强制用pool里的配置。
你打开对应的pool配置文件,搜一下upload_tmp_dir,如果有这个配置,改成你想要的目录,或者直接注释掉,让其他配置生效就行。目标目录的权限没配置对
就算配置改对了,如果新的临时目录没有给PHP-FPM运行用户足够的权限,PHP会悄悄 fallback 到系统默认的/tmp(而且不会报错,这特别坑)。
先确认PHP-FPM的运行用户:看pool配置里的user和group(一般是www-data),然后给新目录设置权限:chown www-data:www-data /path/to/your/new/tmp chmod 700 /path/to/your/new/tmp700权限是最安全的,确保只有PHP进程能读写这个目录。
改完配置没重启PHP-FPM
修改了PHP-FPM的任何配置(不管是pool还是php.ini),都得重启服务才能让新配置生效!很多人改完就直接测试,结果还是用旧配置在跑。重启命令看你的系统:# Debian/Ubuntu 系统 systemctl restart php7.x-fpm # CentOS/RHEL 系统 systemctl restart php-fpm排查其他配置层级的覆盖
除了pool配置,还要检查:- 全局php.ini文件(比如
/etc/php/7.x/fpm/php.ini)里的upload_tmp_dir是不是还指向/tmp - 有没有在vhost里用
php_value upload_tmp_dir设置,但被pool的php_admin_value覆盖了(记住php_admin_value比php_value优先级高)
- 全局php.ini文件(比如
如果还是搞不定,建议打开PHP的错误日志(pool配置里的error_log路径),里面可能会有关于临时目录无法写入的警告,这能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者David

