应修改宝塔面板认可的「额外参数」而非主php.ini,路径需存在、www用户可写且为绝对路径,保存后必须点击「重载配置」而非重启PHP。

PHP upload_tmp_dir 被宝塔面板覆盖了怎么办
宝塔面板默认会通过 php.ini 的「额外配置」机制注入自己的临时目录路径,即使你手动改了主 php.ini,重启 PHP 后也会被重置。这不是权限或路径写错的问题,是面板的主动接管逻辑。
- 宝塔在每次 PHP 服务重启时,会读取
/www/server/php/{版本号}/etc/php.ini,但真正生效的是它自动生成的/www/server/php/{版本号}/etc/php-cli.ini和运行时加载的额外 ini 文件(如/www/server/php/{版本号}/etc/panel.ini) - 关键点:面板把
upload_tmp_dir写在了「PHP 配置附加文件」里,位置通常是/www/server/php/{版本号}/etc/panel.ini或/www/server/php/{版本号}/etc/user.ini - 直接编辑主
php.ini无效,必须找到并修改面板实际加载的那个配置项
怎么确认当前生效的 upload_tmp_dir 值
别猜,用 phpinfo() 或命令行查真实值。Web 环境和 CLI 环境可能不同,而上传行为走的是 Web SAPI,所以必须看 Web 下的结果。
- 新建一个
info.php,内容为<?php phpinfo(); ?>,浏览器访问,搜索upload_tmp_dir行,看「Local Value」列 - 或者用宝塔终端执行:
php -r "echo ini_get('upload_tmp_dir');"—— 这个只反映 CLI 模式,不能代替 Web 环境结果 - 如果显示为空,说明没显式设置,PHP 会 fallback 到系统默认(如
/tmp),但宝塔通常会强制设成/www/wwwroot/default/.tmp这类路径
修改 upload_tmp_dir 的安全实操步骤
核心原则:不硬改主 php.ini,而是通过宝塔认可的方式注入,否则下次更新或重载配置会被覆盖。
- 登录宝塔 → 网站 → 对应站点 → 「PHP 版本」右侧点「设置」→ 「配置文件」选项卡 → 拉到最底部「额外参数」区域
- 在这里添加一行:
upload_tmp_dir = /www/tmp(路径需存在、可写、不属于 Web 可访问目录) - 保存后,**必须点击右上角「重载配置」按钮**(不是「保存」,也不是重启 PHP 服务)——只有这个操作才会触发宝塔重新生成
panel.ini并让新值生效 - 验证:刷新
info.php页面,确认upload_tmp_dir的 Local Value 已更新;同时检查目标路径权限:chown -R www:www /www/tmp && chmod -R 755 /www/tmp
常见错误现象和坑
改完还是 0 字节上传、提示 Unable to move uploaded file 或 move_uploaded_file(): Unable to move,大概率是下面这几个点没踩准。
立即学习“PHP免费学习笔记(深入)”;
-
upload_tmp_dir路径不存在,或www用户无写权限 —— 宝塔下 PHP 进程以www用户运行,不是root - 路径写成相对路径(如
./tmp)或带波浪线(~/tmp),PHP 不解析,会静默失败 - 用了 NFS 或挂载卷作为临时目录,某些内核版本下
move_uploaded_file()会因跨文件系统报错,建议坚持用本地 ext4/xfs 分区 - 同时设置了
session.save_path和upload_tmp_dir到同一目录,但没注意磁盘配额或 inode 耗尽,导致上传卡住无报错
最常被忽略的一点:宝塔的「重载配置」和「重启 PHP」是两回事;前者重写附加配置并通知 PHP-FPM 重读,后者只是杀进程再拉起,不一定加载新值。真要调,盯紧「重载配置」按钮。



















