缓存未命中是因key不匹配或策略绕过,非开关未开;带@dev等约束、repositories变更、协议混用、缺少HTTP缓存头、CI未持久化缓存目录及key不含lock哈希等均导致失效。

缓存没命中,不是没开,是没用上
看到 Downloading 而不是 Downloading (cached),就说明缓存根本没生效——哪怕 ~/.composer/cache/files/ 里一堆 ZIP 文件也白搭。这不是配置开关没开的问题,而是缓存 key 不匹配或策略被绕过。
- 带
@dev、dev-master或dev-develop的版本约束,强制走 VCS 克隆,跳过文件缓存 - 改了
composer.json中的repositories,哪怕只加个空格,VCS 缓存 key 就变,旧克隆作废 - 私有 Git 地址混用 SSH(
git@git.example.com:repo.git)和 HTTPS(https://git.example.com/repo.git),Composer 视为两个仓库,缓存不互通 - Git 服务器没返回
Cache-Control: public, max-age=3600或ETag头,Composer 每次都 fetch,不敢复用本地裸仓
CI/CD 中缓存形同虚设的三大硬伤
只缓存 vendor/ 目录,等于没做缓存优化。真正要命的是每次构建都丢掉 ~/.composer/cache/,导致 composer install 从零下载。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须显式设置
COMPOSER_CACHE_DIR环境变量,指向 CI 平台能持久化的路径(如.composer/cache),不能依赖默认位置 - cache key 必须包含
composer.lock哈希,推荐 GitHub Actions 用${{ hashFiles('**/composer.lock') }},否则时间戳微调就 miss - 不同 PHP 或 Composer 版本共用同一缓存目录会冲突,key 中应加入
php-${{ matrix.php-version }}
启用 VCS 缓存并让它真起作用
cache-vcs true 不是开了就自动加速。它只对 shallow clone 有效,且严重依赖 Git 服务端配置和客户端 URL 一致性。
- 全局开启:
composer config -g cache-vcs true - 确保所有 Git 仓库地址统一用 HTTPS,并在 Nginx/Apache 中配置响应头:
add_header Cache-Control "public, max-age=3600"; - 避免在
composer.json中手动写"type": "package"+"source",这直接绕过缓存机制,改用"dist"字段指定 ZIP 下载地址 - 私有包认证缺失时,VCS 克隆阶段会因
COMPOSER_AUTH未设置而失败,回退重拉——即使缓存存在也白搭
缓存生命周期与磁盘空间的实际取舍
cache-files-ttl 默认 6 个月(15552000 秒),对 CI 环境太长;但设太短又频繁重下。生产部署和开发机器的策略应分开。
- CI 环境建议设为
2592000(30 天),配合定期composer clear-cache --gc清理过期项 - 本地开发机可保留默认值,但需配
cache-files-maxsize(如1024MiB),防 SSD 被撑满 -
cache-ttl控制元数据缓存(如 packages.json),国内镜像源建议设短些(86400秒),避免因 packagist.org 元数据延迟导致解析偏差 - 改完配置后务必执行
composer clear-cache,否则旧缓存仍可能干扰新策略
Cloning (from cache) —— 没这行,其他所有配置都是纸面功夫。

















