它的本质是/tmp是 Linux 系统中一个特殊的、全局共享的、具有“易失性”和“粘性”的临时存储区域。它既是程序间交换数据的“公共广场”也是安全漏洞的“重灾区”更是系统清理策略的“牺牲品”。对于 PHP 开发者而言理解/tmp的行为模式是避免 Session 丢失、防止提权攻击、优化文件上传性能的关键。如果把/tmp比作火车站的寄存处全局共享任何人都可以来存包创建文件。粘性 (Sticky Bit)你只能拿走自己的包不能动别人的包即使你能看到它们。易失性车站规定超过 10 天没人取的包会被清洁工直接扔掉系统清理。重启清空如果车站重建服务器重启所有寄存处的东西都会消失。核心逻辑便利性与安全性的妥协产物。用“公开可见”换取“写入便捷”用“定期清理”换取“空间释放”。一、权限机制粘滞位 (Sticky Bit) 的魔法1. 为什么/tmp通常是1777drwxrwxrwt10root root4096Apr2210:00 /tmprwxrwxrwx(777)所有人可读、可写、可执行。这意味着任何用户包括www-data,mysql,nobody都可以在这里创建文件。t(Sticky Bit, 1)这是关键含义即使用户对目录有写权限也只能删除或重命名自己拥有的文件。作用防止用户 A 恶意删除用户 B 创建的临时文件。例外root 用户不受此限制。2. 安全隐患可见性问题虽然不能删别人的文件但可以列出 (ls) 和读取 (如果文件权限宽松)别人的文件名。风险信息泄露文件名可能包含敏感信息如sess_user_admin_token。侧信道攻击通过监控/tmp下文件的创建/修改时间推测其他进程的活动规律。符号链接攻击 (Symlink Attack)早期经典漏洞。攻击者创建指向/etc/passwd的软链接诱导以 root 运行的程序向该链接写入数据从而篡改系统文件。现代内核和 PHP 已对此有防护但仍需警惕。 核心洞察/tmp的“开放”是双刃剑。它方便了协作也暴露了行踪。二、清理策略谁在打扫房间/tmp不会无限膨胀因为有清洁工。但清洁工的规则因发行版而异。1. systemd-tmpfiles (现代 Linux)机制由systemd管理。配置/usr/lib/tmpfiles.d/tmp.conf。默认规则# 类型 路径 模式 用户 组 年龄(秒) v /tmp 1777 root root 10d含义清理/tmp下超过10 天未访问的文件。执行时机系统启动时或定时器触发时。2. cron jobs (传统 Linux)工具tmpwatch(CentOS 6) 或tmpreaper(Debian/Ubuntu)。命令tmpwatch 240 /tmp(清理 240 小时未访问的文件)。风险如果 PHP Session 的gc_maxlifetime设置为 1440 秒 (24 分钟)但系统清理策略是 10 天那么 PHP 的 GC 机制负责删除过期 Session。但如果系统重启/tmp被清空Session 会立即丢失无论是否过期。3. 重启清空 (Clear on Boot)配置/etc/default/rcS(Debian) 或 systemd 配置。现象很多云服务器或容器重启后/tmp是空的。后果存储在/tmp的 Session、上传的临时文件、缓存全部丢失。三、PHP 交互陷阱当代码遇见/tmp1. Session 存储 (session.save_path /tmp)陷阱 A权限冲突如果 PHP-FPM 以www-data运行它在/tmp创建sess_xxx。如果另一个脚本以root运行并修改了该文件权限www-data可能无法再读写。陷阱 BGC 效率低下PHP 的 Session GC 需要遍历整个/tmp目录。如果/tmp下有几十万个其他临时文件GC 过程会极慢导致请求超时。陷阱 C多服务器不共享在负载均衡环境下用户请求可能被分发到 Server ASession 存在 A 的/tmp。下次请求到了 Server BB 的/tmp里没有这个 Session用户被迫重新登录。2. 文件上传 (upload_tmp_dir)默认如果php.ini中未设置upload_tmp_dirPHP 使用系统默认的/tmp。风险磁盘满如果用户上传大文件/tmp所在分区通常是根分区/可能爆满导致整个系统崩溃。inode 耗尽大量小文件上传会耗尽 inode导致无法创建新文件。最佳实践upload_tmp_dir /var/www/uploads_tmp并将该目录挂载到独立的大容量磁盘分区。3. 临时文件操作 (tempnam(),tmpfile())tempnam(/tmp, prefix)在/tmp创建唯一文件。安全问题在旧版本 PHP 或配置不当的系统上可能存在竞态条件导致文件被劫持。建议使用sys_get_temp_dir()获取系统临时目录但最好指定应用专用的子目录。四、最佳实践如何优雅地使用/tmp1. 永远不要依赖/tmp存储持久数据原则/tmp中的数据随时可能消失。行动重要数据必须存入数据库、对象存储 (S3) 或专用数据盘。2. 为 PHP 创建专用临时目录步骤mkdir-p/var/lib/php/tmpchownwww-www-data /var/lib/php/tmpchmod1733/var/lib/php/tmp# Sticky bit Owner RWX配置php.inisession.save_path /var/lib/php/session upload_tmp_dir /var/lib/php/uploads sys_temp_dir /var/lib/php/tmp优势隔离、安全、易于监控和清理。3. 监控/tmp使用情况命令df-h/tmp# 检查磁盘空间df-i/tmp# 检查 inode 使用率ls-lt/tmp|head# 查看最新文件告警当/tmp使用率超过 80% 时发出告警。4. 考虑使用tmpfs(内存盘)原理将/tmp挂载为tmpfs数据存储在 RAM 中。优势极速 I/O重启自动清空。劣势占用内存容量有限。适用高并发、小文件临时处理场景。mount-ttmpfs-osize1G tmpfs /tmp 总结原子化“/tmp”全景图维度特性风险/注意点权限1777(全局可写粘滞位)文件名可见侧信道泄露持久性易失(重启清空定期清理)不可存持久数据性能磁盘 I/O (除非 tmpfs)高并发下锁竞争/GC 慢PHP 关联Session, Uploads, Temp Files需隔离目录避免冲突安全低 (共享空间)** symlink 攻击, 权限提升**隐喻公共储物柜需自带锁且随时可能被清退终极心法/tmp的本质是“短暂的信任”。系统信任你能管好自己创建的文件。但你不能信任/tmp能永远保存你的数据。别把家安在旅馆里。于共享中见便利于易失中见风险以隔离为策解混乱之牛于临时存储中求稳健之真。行动指令检查配置php -i | grep -E session.save_path|upload_tmp_dir。审计目录ls -ld /tmp确认权限是否为1777。创建专用目录为 Session 和上传文件创建独立目录并修改php.ini。监控清理策略查看systemd-tmpfiles或cron配置了解文件存活时间。思维升级记住/tmp是系统的下水道不是仓库。保持它的流动别让它堵塞。