composer缓存不是运行时缓存,不参与请求链路,仅缓存zip包、dist哈希及元数据;失效表现为重下包变慢、lock文件缺失触发全量解析、镜像源fallback等,而非雪崩式故障。

Composer 库缓存失效不会引发雪崩——它根本不是运行时缓存,也不参与请求链路。你真正要防的,是 composer install 或 composer update 过程中因依赖解析失败、镜像不可用、锁文件冲突导致的构建阻塞或部署卡死,这类问题在 CI/CD 高频触发时会表现为“批量构建雪崩”,但和 Redis/Laravel 缓存雪崩是两回事。
Composer 的“缓存”到底指什么?
Composer 自带的 vendor/composer/cache(或 ~/.composer/cache)只缓存下载的 ZIP 包、dist 包哈希、元数据 JSON,不缓存已安装的代码逻辑。它不拦截任何 HTTP 请求,也不影响 PHP 运行时性能。所谓“失效”,通常只是:cache:clear 后重下包变慢、composer.lock 被误删导致依赖重解析、镜像源返回 503 导致所有构建并发 fallback 到 packagist.org。
- 没有 TTL,没有过期时间,不存在“同时失效”
- 不共享进程间状态,PHP-FPM worker 之间互不影响
- 不涉及数据库回源,也没有“穿透”或“击穿”概念
CI/CD 中高频 composer install 卡住的真实原因
当 GitLab CI 或 GitHub Actions 并发跑 20+ 个 job,每个都执行 composer install --no-interaction,真正出问题的环节是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.lock文件缺失或校验失败 → 触发composer update全量解析,耗时从秒级升到分钟级 - 镜像源响应超时(如阿里云镜像临时不可用),所有 job 同时 fallback 到官方源,触发 rate limit 或连接池打满
- PHP 扩展缺失(如 missing
ext-zip)导致install中途退出,但 CI 日志只显示 “Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1”,掩盖真实原因 - Docker 构建层未复用 cache,每次从
composer.json开始重装,跳过 vendor 缓存
能落地的预防动作(非“加随机 TTL”)
别碰 Composer 自身缓存机制,重点控 CI 流程和环境一致性:
- 强制提交
composer.lock,禁止 CI 中运行composer update;用composer install --no-dev --prefer-dist --optimize-autoloader - 在 CI 前置步骤中检查
composer validate和php -m | grep zip,失败立即中断,避免卡在 install 中间 - 用
COMPOSER_CACHE_DIR绑定 CI runner 的共享缓存目录(如/tmp/composer-cache),而非默认用户 home 路径 - 镜像源配置写进
composer.json的repositories字段,而不是靠全局 config —— 否则不同 job 可能读到不同配置 - Dockerfile 中把
composer install放在单独一层,并在 COPYcomposer.json+composer.lock后立即 RUN,确保 layer 复用
真正的高并发压力从来不在 Composer 缓存上,而在你没锁死的 lock 文件、没验证的扩展依赖、和没隔离的 CI 环境里。这些地方一松动,十次部署里有八次会卡在同一个点上,看起来像雪崩,其实是流程漏洞。










