Composer install卡在Downloading本质是高并发触发镜像QPS限流,非带宽或性能问题;须同步配置多镜像(含"canonical": false)、降并发至2(composer config -g repos.packagist.org.concurrent-downloads 2)、清缓存,并关闭--no-dev/--no-scripts/--no-autoloader等干扰项。

composer install卡在Downloading阶段,本质是HTTP连接被限流
不是带宽不够,也不是机器太慢,而是 Composer 默认高并发(5–10)触发了国内镜像的 QPS 限制。阿里云、腾讯云、清华等主流镜像普遍对单 IP 每分钟请求设硬上限(如 60 次),超限直接返回 429 Too Many Requests 或静默丢包。日志里反复出现 curl: (28) Operation timed out 或 Connection refused 就是典型信号。
关键点在于:Composer 的依赖解析是串行的,但下载阶段才真正并行——它不会自动降级,只管发请求。一旦某个镜像响应慢或失败,所有后续请求都得排队等它超时(默认 300 秒),形成“一个包拖垮全链路”的局面。
必须同时配多镜像 + 降并发 + 清缓存,三者缺一不可
单换一个镜像源(比如只切阿里云)在 CI/CD 场景下极易卡住,因为批量构建节点会集中打向同一地址,瞬间触发限流。正确做法是启用 Composer 原生多镜像负载均衡:
- 在项目
composer.json的repositories下添加至少 3 个国内镜像,并确保每个都带"canonical": false—— 缺了这个,Composer 只认第一个,后面形同虚设 - 全局设低并发:运行
composer config -g repos.packagist.org.concurrent-downloads 2(不是http-max-concurrent-downloads,那是旧配置项) - 换镜像后立刻执行
composer clear-cache,否则旧元数据仍走packagist.org,等于白配
验证是否生效:composer config -g | grep concurrent 应输出 "concurrent-downloads": 2;composer config -g repo.packagist 应显示完整 URL(注意结尾必须有 /,否则拼接路径出错导致 404)。
CI/CD 中必须关闭的三个干扰项
开发环境需要的特性,在构建阶段全是性能杀手:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev:跳过require-dev下所有包(如phpunit、phpstan),避免测试类污染 autoload classmap -
--no-scripts:禁用post-install-cmd等钩子,防止意外触发npm install或数据库清理操作 -
--no-autoloader:不生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补,避免安装时同步扫描 PSR-4 目录
这些参数漏掉任意一个,composer install 都可能多花 30%–60% 时间。别信“看起来快一点”,要跑 composer install -vvv 看日志里是否真有多个 Downloading https:// 行交错出现。
并发数不是越高越好,2–8 是多数环境的安全区间
设成 20 看似激进,实则容易引发本地文件系统竞争:file_put_contents(/tmp/): failed to open stream 就是临时目录句柄争抢的明确报错。更隐蔽的问题是:高并发下 PHP 的 cURL 多线程会加剧 DNS 缓存击穿和 TLS 握手抖动,尤其在 WSL2 或低内存容器中。
推荐值:
- 本地开发机:设为
6或8,兼顾速度与稳定性 - CI/CD 流水线:统一设为
2,配合多镜像 fallback,抗抖动能力最强 - 私有仓库若不支持
Accept: application/json或返回 302 跳转,强行高并发会退化为串行流程,此时宁可设为1
最后提醒一句:所有优化都建立在 composer --version 输出为 2.2+ 的前提下。低于此版本(比如还停留在 1.x),concurrent-downloads 配置完全无效——先升级,再调参。

















