临时目录(sys_get_temp_dir)才是磁盘满的真凶:Composer解压ZIP、生成autoloader、运行脚本均依赖该目录,Windows为C:\Users\用户名\AppData\Local\Temp,Linux/macOS默认为/tmp,易堆积composer_.zip、php.phar等未清理文件,且常导致inodes耗尽(df -i显示Use%≈100%),即使df -h仍有空间也会报“No space left on device”。

临时目录(sys_get_temp_dir)才是磁盘满的真凶
报 No space left on device 却发现 df -h 显示磁盘还有几十 GB?大概率是 PHP 的临时目录塞爆了——Composer 解压 ZIP、生成 autoload、运行脚本时全走 sys_get_temp_dir(),而这个路径在 Windows 是 C:\Users\用户名\AppData\Local\Temp,Linux/macOS 默认是 /tmp。它不归 Composer 管,但比 cache-dir 更容易堆积 composer_*.zip、php*.phar 这类未清理文件。
- 先确认实际路径:
php -r "echo sys_get_temp_dir();" - Windows 用户进资源管理器,直接打开该路径,搜
composer_和php,手动删掉所有匹配项 - Linux/macOS 运行:
find $(php -r "echo sys_get_temp_dir();") -name "composer_*" -o -name "php*.phar" -delete 2>/dev/null - 注意:别用
rm -rf /tmp全清——可能干掉其他进程正在用的临时文件
怎么让 Composer 别往默认临时目录写
不能改 sys_get_temp_dir() 全局行为(会影响其他 PHP 应用),但可以给 Composer 单独指定临时位置。关键不是改 Composer 配置,而是改 PHP 启动参数或环境变量。
- Linux/macOS:启动命令前加
TMPDIR="/mnt/data/tmp" php -d sys_temp_dir="/mnt/data/tmp" composer install - Windows PowerShell:
$env:TMP="D:\temp"; $env:TEMP="D:\temp"; php "-d" "sys_temp_dir=D:\temp" composer install - 确保目标目录存在且有写权限:
mkdir -p /mnt/data/tmp && chmod 1777 /mnt/data/tmp - 验证是否生效:
php -d sys_temp_dir="/mnt/data/tmp" -r "echo sys_get_temp_dir();"输出应为你指定的路径
为什么只清缓存不管用?inodes 耗尽更致命
清完 ~/.composer/cache 还报错?十有八九是 inodes 耗尽。Composer 缓存里每个包版本都建独立子目录(比如 ~/.composer/cache/files/monolog/monolog/1.27.0/),全是小文件——df -i 显示 Use% 接近 100%,哪怕磁盘剩 50GB 也照样失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查 inodes:
df -i | grep "$(df -h | grep -E '(/tmp|/home|/root)' | head -1 | awk '{print $1}')" -
composer clear-cache对 inodes 释放效果有限,因为它不删“有效但陈旧”的包缓存 - 真正管用的是:
composer config --global cache.vcs false(禁用 Git 源码缓存,省最多 inodes) - 再配合:
composer config --global cache.dist false(慎用,会重复下载,但彻底消灭 dist 子目录)
换缓存目录后仍卡在 Downloading?进程锁没清干净
换完 cache-dir 或重定向 sys_temp_dir,运行 composer install 还卡在 Downloading?说明有残留进程正占着旧临时目录里的文件锁,导致新进程反复尝试写入失败。
- Linux/macOS 先杀光:
kill -9 $(pgrep -f "composer\|php.*composer") 2>/dev/null || true - Windows 用:
taskkill /F /IM php.exe /FI "WINDOWTITLE eq *composer*"(或手动查tasklist | findstr composer) - 再确认无残留:
lsof +D "$(php -r "echo sys_get_temp_dir();")" 2>/dev/null | grep composer - 最后才运行新命令——否则换路径只是把问题从 C 盘挪到 D 盘,锁依然在
临时目录重定向不是一劳永逸的补丁,它绕开了系统默认限制,但也意味着你得自己维护那个新目录的生命周期。最常被忽略的是:每次换路径后,必须确保旧临时目录里没残留锁文件,否则 Composer 会在两个目录间反复失败。

















