临时目录爆满需精准清理Composer临时文件:Windows执行del /s /q "%TEMP%\composer*",Linux/macOS用find $(php -r "echo sys_get_temp_dir();") -name "composer-*.zip" -o -name "composer-*.phar" -delete,并确认无进程占用;可设TMPDIR环境变量重定向路径。

临时目录(sys_get_temp_dir)爆满怎么快速清空
Composer 解压 ZIP、生成 autoload、运行脚本时,会高频使用 PHP 的 sys_get_temp_dir() 返回路径,Windows 默认是 C:\Users\用户名\AppData\Local\Temp,Linux/macOS 通常是 /tmp 或 $TMPDIR。这个目录不归 Composer 管,但一旦塞满,composer install 就会报 “No space left on device” 或卡在 “Extracting archive” 阶段,错误里却完全不提 “temp” 字样。
应急清理方式:
- Windows:用管理员权限打开命令提示符,运行
del /s /q "%TEMP%\composer*"(注意不是del /s /q "%TEMP%\",避免误删其他进程临时文件) - Linux/macOS:运行
find $(php -r "echo sys_get_temp_dir();") -name "composer-*.zip" -o -name "composer-*.phar" -delete,只清 Composer 相关临时包,保留系统其他临时文件 - 确认是否被占用:Linux/macOS 上用
lsof +D $(php -r "echo sys_get_temp_dir();") | grep composer查看是否有进程正锁着这些文件,常见于杀毒软件或 IDE 扫描
如何让 Composer 别往 C 盘临时目录写东西
改不了 sys_get_temp_dir()?可以绕过它。Composer 本身不直接控制解压路径,但能通过环境变量把整个临时操作导向大容量盘。
生效最快的方式:
- Linux/macOS:执行
TMPDIR="/data/tmp" composer install(注意大小写,TMPDIR是 POSIX 标准变量,PHP 识别它优先级高于系统默认) - Windows CMD:运行
set TMP=C:\large-disk\tmp && composer install - PowerShell:运行
$env:TMP="C:\large-disk\tmp"; composer install - 永久生效(仅限本地开发):把
TMPDIR或TMP加进 shell 配置(如~/.zshrc)或 Windows 系统环境变量,但 CI/CD 中不推荐——应由构建平台统一管控
为什么清了缓存,composer install 还是失败
composer clear-cache 只动 ~/.composer/cache,和 sys_get_temp_dir() 完全是两个地方。很多用户执行完 clear-cache 发现磁盘空间没变化,就以为“没用”,其实是根本没清对位置。
典型误判场景:
- 错误地认为
clear-cache会删掉vendor/或%TEMP%下的文件 —— 它不会 - 在 WSL 或 macOS APFS 上,
df -h显示还有空间,但报 “No space left on device” —— 很可能是 inodes 耗尽,运行df -i确认;临时目录下小文件过多(如成千上万个composer-xxxxx.zip)极易触发 - CI 流水线中用了 Docker,
/tmp挂载在内存盘(tmpfs),默认只有几百 MB,docker run时没加--tmpfs /tmp:size=2g,导致爆满后无提示静默失败
临时目录空间不足的连带现象与验证方法
它不只影响解压,还会让 Composer 在多个环节出怪异行为,容易误判为网络或权限问题。
可复现的现象包括:
-
Resolving dependencies阶段卡住超过 2 分钟,且ps aux | grep composer显示进程 RSS 内存停滞在几百 MB 不涨 —— 实际是写临时文件失败后反复重试 - 下载完成却报
file_put_contents(/tmp/composer-xxx.zip): failed to open stream: No such file or directory—— 注意路径是/tmp,不是 vendor 或 cache - 启用
--verbose后看到大量Extracting xxx.zip日志,但最终失败,ls -la $(php -r "echo sys_get_temp_dir();")会发现该目录下有大量未完成的composer-*.part文件 - 用
strace -e trace=openat,write,unlink -f php composer.phar install 2>&1 | grep -i temp(Linux)可直接观察到 write 失败的系统调用
临时目录这事,从来不是 Composer 的配置问题,而是运行时环境的资源分配问题。别在 composer.json 里折腾,先盯住 sys_get_temp_dir() 的实际路径和可用 inodes。











