PHP临时目录写满导致服务卡死、502/504或文件操作失败但无报错;根源是/tmp分区满且多服务共用;应改php.ini、MySQL配置指向独立可写路径如/var/tmp/php-upload,并挂载独立tmpfs分区。

PHP临时目录写满的典型表现
不是“PHP报错”,而是整个服务突然卡死、502、504,或者file_get_contents()、move_uploaded_file()返回false但error_get_last()拿不到有效信息。背后往往是/tmp分区df -h显示100%,MySQL的tmpdir、PHP的upload_tmp_dir、会话文件、OPcache临时缓存全挤在同一个地方。
确认/tmp是否真满了且被PHP使用
别猜,直接查:
- 运行
df -h /tmp或df -h $(dirname $(mktemp)),看剩余空间是否 - 查PHP实际用的上传临时目录:
php -i | grep upload_tmp_dir,若为空,说明走系统默认/tmp - 查会话存储位置:
php -i | grep session.save_path,很多默认也落在/tmp - 查MySQL临时目录:
mysql -e "SHOW VARIABLES LIKE 'tmpdir';",它和PHP共用同一块磁盘时风险加倍
不重启服务快速清理/tmp
清理不是删光,而是精准释放:
- 删过期会话文件:
find /tmp -name "sess_*" -mmin +30 -delete(假设session.gc_maxlifetime=1800) - 删PHP上传残留:
find /tmp -name "php*" -mmin +10 -delete(上传中断后留下的临时文件) - 跳过正在被进程占用的文件:
lsof +D /tmp 2>/dev/null | grep deleted,这类文件即使rm了磁盘也不释放,需重启对应进程(如php-fpm) - 别碰
/tmp/systemd-private-*目录——那是systemd沙箱,删了会导致服务异常
永久避开/tmp依赖的配置动作
改配置比天天清理靠谱:
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini中显式设upload_tmp_dir = /var/tmp/php-upload,然后mkdir -p /var/tmp/php-upload && chmod 1733 /var/tmp/php-upload - 设
session.save_path = /var/tmp/php-sessions,同样创建目录并赋权 - MySQL侧,在
/etc/my.cnf里加tmpdir = /var/tmp/mysql-tmp,确保该路径所在分区有足够空间 - 所有新路径必须由
www-data或nginx用户可写,用chown www-data:www-data /var/tmp/php-upload确认
这些路径最好挂载在独立分区或tmpfs(如mount -t tmpfs -o size=512M tmpfs /var/tmp),避免和系统日志、数据库数据抢同一块磁盘。临时目录失控从来不是PHP的问题,而是资源没隔离清楚。



















