这是典型的 inode 耗尽问题,需用 df -i 确认;应优先执行 composer clear-cache 清理缓存,再通过 composer config --global cache-dir 切换至 inode 充足路径,并配置 cache-files-dir false 降低膨胀速度。

composer install 或 update 报 disk full,但 df -h 显示还有空间?
这是典型的 inode 耗尽问题,尤其在 macOS(APFS)或某些 Linux 发行版上常见。Composer 缓存目录(~/.composer/cache)会生成大量小文件(如哈希目录、zip 包、dist 文件),每个文件都占用一个 inode。即使磁盘块还有余量,inode 用光后也会报 disk full。
验证方式:df -i 查看 inode 使用率,若 Use% 接近 100%,就是它了。
- macOS 上默认 APFS 卷对小文件极不友好,
~/.composer/cache很容易积累数万级临时文件 - 不要直接
rm -rf ~/.composer/cache后立刻跑composer install——它会瞬间重建大量缓存,可能再次打满 inode - 建议先清空再限速重建:运行
composer config --global cache-dir /tmp/composer-cache,把缓存临时切到/tmp(通常 tmpfs 或大 inode 分区)
清理 composer 缓存的正确顺序和关键参数
用 composer clear-cache 是最安全的方式,它会调用 Composer 内部逻辑,同时清理 cache-dir 和 repo-cache-dir(如果启用),并校验路径权限。手动删目录容易遗漏或触发后续权限错误。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行前确认当前用户有缓存目录写权限:
ls -ld $(composer config --global cache-dir) -
composer clear-cache会输出实际清理路径和文件数,留意是否报Permission denied—— 若有,说明部分子目录属主不是当前用户(常见于 sudo 运行过 composer) - 想只清 dist 缓存(.zip/.tar 包)节省时间?不行。
clear-cache不支持按类型过滤;若只想清包,得手动进$(composer config --global cache-dir)/files/删*.zip和*.tar,但风险高,不推荐
长期避免磁盘/ inode 满的关键配置
Composer 默认不做缓存生命周期管理,全靠手动清理。两个配置能显著降低缓存膨胀速度:
- 关闭 dist 缓存:
composer config --global cache-files-dir false(注意是false字符串,不是布尔值)。这样 composer 只缓存源码(git clone),不存 zip 包,省空间但首次 install 稍慢 - 限制重试与并发:
composer config --global github-protocols ["https"]避免 ssh 协议卡住导致临时文件堆积;composer config --global process-timeout 300防止超时任务残留锁文件 - 慎用
composer dump-autoload --optimize在 CI 中——它生成的vendor/composer/autoload_classmap.php是单大文件,但失败时可能留临时文件,且对现代 PHP 版本收益极小
CI/CD 环境下清理必须加的防护措施
GitHub Actions、GitLab CI 等环境常复用 runner,~/.composer/cache 会跨 job 残留。单纯 composer clear-cache 不够,因为:
- 某些 runner 镜像预装了全局 composer,
--global配置可能被覆盖 - job 并发时,多个
composer install可能同时写同一缓存目录,产生损坏或残留 - 推荐方案:每个 job 开头强制指定独立缓存路径 + 清理:
composer config --global cache-dir $HOME/.composer-cache-$RUNNER_NAMErm -rf $HOME/.composer-cache-$RUNNER_NAME
真正麻烦的从来不是“怎么删”,而是删完立刻又被填满——关键在控制缓存生成节奏和位置,而不是等爆了再救火。










