composer install 有时快有时慢,根本原因在于是否命中三类缓存:files/(zip包)、repo/(元数据)、dist/(解压后文件);未命中则重下重解,而vcs/缓存不清理易致inode耗尽。

composer install 为什么有时快、有时慢?缓存路径和类型决定一切
因为 composer install 默认复用三类缓存:下载的 .zip/.tar 包(files/)、解压后的 dist 文件(dist/)、远程仓库元数据(repo/)。它不读取 vcs/(Git 克隆缓存),除非你没加 --prefer-dist。真正影响速度的是:是否命中 files/ 中的压缩包,以及 repo/ 里有没有最新版的 packages.json 快照。
常见错误现象:composer install 第一次很快,第二次反而卡在 Resolving dependencies —— 这不是缓存失效,而是 composer.lock 锁定的版本在本地 repo/ 缓存里找不到对应元数据(比如镜像源更新延迟或 TTL 未过期)。
-
files/缓存位置由cache-files-dir控制,默认在~/.composer/cache/files -
repo/缓存受cache-repo-dir影响,但 Composer 2.x 不再暴露该配置,实际路径固定为~/.composer/cache/repo -
dist/缓存默认启用,可通过cache-dir-dist false关闭,但会显著拖慢首次安装(需现场解压) - 所有缓存路径都可通过
composer config --global cache-dir查到真实位置,别猜
clear-cache 清不干净?vcs/ 和 inode 是隐形杀手
composer clear-cache 默认清 files/、repo/、vcs/ 三个子目录,但实际执行时会跳过 vcs/ —— 这是 Composer 的一个隐藏行为,尤其在 Linux/macOS 上,vcs/ 下单个 Git 裸仓库能占 300–800 MB,且每个 commit 都生成独立 inode,极易耗尽。
典型症状:No space left on device,而 df -h 显示磁盘还有空间 —— 此时必须查 inode:df -i。如果 ~/.composer/cache/vcs/ 占用接近 100%,就是它。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 手动清理
vcs/安全:Linux/macOS 执行rm -rf ~/.composer/cache/vcs/*;Windows 用rd /s /q "%APPDATA%\Composer\Cache\vcs" - 永久禁用:
composer config --global cache.vcs false,后续所有包强制走--prefer-dist - 清理前先停掉所有 PHP 进程,否则可能报
Corrupted cache file或权限拒绝 - 若
clear-cache提示Permission denied,大概率是缓存文件属主为root(之前用sudo composer install留下的),修复命令:sudo chown -R $USER:$(id -gn) $(composer config --global cache-dir)
只清“不用的旧包”,而不是全盘删
Composer 没有内置命令按包名或版本筛选缓存,但你可以精准定位冗余包:缓存里存着 monolog/monolog/1.20.0.zip、1.25.0.zip、2.4.0.zip,而你所有项目 composer.lock 里只引用了 2.4.0,那前两个就是可删的。
操作前务必确认当前缓存路径:composer config --global cache-dir,然后进 files/ 目录,结构是 vendor-name-package-name/version-hash.zip。
- 查项目正在用的版本:
grep -A 1 '"name": "monolog/monolog"' your-project/composer.lock | grep version - Linux/macOS 批量删旧版:
find $(composer config --global cache-dir)/files -name "monolog-monolog-1.20.0.zip" -delete - 别直接删整个
monolog-monolog/目录,只删明确不用的.zip文件 -
repo/packagist.org/是核心索引缓存,删了会导致下次composer update卡十几秒拉元数据,不建议动
--no-cache 不是万能解药,但它能绕过所有缓存陷阱
当 composer install 行为异常(比如反复装旧版、报 corrupted archive、卡在 SAT 解析),最直接的验证方式是加 --no-cache 强制跳过全部缓存逻辑——它让 Composer 忽略 files/、repo/、dist/,所有包重新下载、重新解析。
注意:--no-cache 只作用于本次命令,不影响配置;它不能解决镜像配置错误、PHP 版本不兼容、或 composer.lock 冲突等根本问题。
- CI/CD 中必须搭配
--no-interaction,否则clear-cache会卡在交互确认 - 调试时推荐组合:
composer install --no-cache --prefer-dist --no-dev -v,输出详细日志,且跳过开发依赖节省时间 - 如果加了
--no-cache后仍卡在Resolving dependencies,说明问题不在缓存,而在约束冲突,此时该用composer why-not some/package定位阻断链 -
--download-only是另一个轻量替代:只下载不安装,适合提前预热缓存,但不会触发 autoloader 优化
files/ 影响下载速度,repo/ 影响依赖解析,vcs/ 吃 inode,而 composer.lock 和镜像配置才是多数问题的真正源头。










