磁盘空间不足不是 Composer 的 bug,而是它在写缓存、解压包、生成 autoload 时对磁盘和 inode 的双重消耗未被及时察觉——需先停进程、查 cache-dir、清缓存、关非必要缓存项。

磁盘空间不足不是 Composer 的 bug,而是它在写缓存、解压包、生成 autoload 时对磁盘和 inode 的双重消耗没被及时察觉——先停进程、查 cache-dir、清缓存、关非必要缓存项,四步到位。
如何确认是磁盘还是 inode 耗尽?
Composer 卡在 Downloading 或报 No space left on device,不一定是磁盘满。尤其在容器、CI 环境或挂载卷里,df -h 显示还有空间,但 df -i 的 Use% 接近 100%,就说明 inode 耗尽了。Composer 缓存大量小文件(比如 ~/.composer/cache/files/ 下每个包一个子目录),正是 inode 杀手。
- 运行
df -i,重点看/tmp和cache-dir所在挂载点 - 用
composer config cache-dir查当前缓存路径,默认是~/.composer/cache - 再用
du -sh ~/.composer/cache/* | sort -hr | head -5快速定位最大子目录(通常是files/和repo/)
清缓存前必须停掉所有 composer 进程
直接 rm -rf ~/.composer/cache 很危险:如果 IDE 内嵌的 Composer 正在后台扫描、或上一个 composer install 没完全退出,删缓存会触发 file_put_contents(): No space left on device 错误,甚至损坏索引。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先执行
ps aux | grep composer,杀掉残留进程(包括php /path/to/composer.phar类型) - 再运行
composer clear-cache—— 它会校验缓存完整性,比手动删更安全 - 清完用
du -sh ~/.composer/cache确认是否真空了;若仍报错,说明有进程锁着文件,得重试 kill 步骤
禁用 ZIP 和源码缓存,从源头减负
默认 Composer 同时缓存 ZIP 包、解压后的源码、以及 repo 元数据。其中 ZIP 和源码缓存占空间最多,且对 CI 或低配机器意义不大。
- 禁用 ZIP 缓存:
composer config --global cache-files-ttl 0 - 禁用解压后源码缓存:
composer config --global cache-files-maxsize 0 - 保留
cache-repo(只存 JSON 元数据,体积小、加速依赖解析) - CI 场景下直接加
--no-cache参数:composer install --no-cache --no-interaction
缓存目录迁移到大空间路径(尤其 Docker 场景)
容器内 /root/.composer/cache 所在分区常是 tmpfs 或小容量挂载卷,宿主机磁盘再大也没用。不能改 Composer 解压中转目录,但可以统一挪走整个缓存根目录。
- 用环境变量优先级最高:
COMPOSER_CACHE_DIR=/mnt/big-disk/composer-cache - Docker 中记得显式挂载:
docker run -v /host/cache:/root/.composer/cache ...,别依赖默认绑定 - 临时测试可先设变量再运行:
COMPOSER_CACHE_DIR=/tmp/composer-cache php -d memory_limit=2G composer install
真正容易被忽略的是:缓存清理只是止痛,禁用 cache-files-ttl 和 cache-files-maxsize 才是防复发的关键;而 df -i 不查,你永远不知道为什么磁盘明明有空余却装不上依赖。

















