composer install卡在downloading本质是并发触发镜像qps限流,须同步配至少3个带"canonical": false的国内镜像、降并发至2(composer config -g repos.packagist.org.concurrent-downloads 2)、清缓存;缺一不可。

为什么换镜像后 composer install 仍卡在 Downloading
根本不是镜像没选对,而是并发请求撞上了单 IP 的 QPS 限流。阿里云、清华、腾讯等主流镜像普遍限制每 IP 每分钟 60 次请求——CI 流水线一触发十几个构建节点,几秒内就全被 429 或静默超时拦住。日志里反复出现 curl: (28) Operation timed out 或 Downloading 行长时间不动,就是典型信号。
关键点在于:Composer 的下载阶段是真并发,但只要一个包因限流失败,整个并发池就会阻塞等待(默认超时 300 秒),导致“一个包拖垮全链路”。光调高 http-max-concurrent-downloads 反而更糟。
- 必须配多镜像 fallback,且每个国内源都加
"canonical": false,否则 Composer 只用第一个,其余形同虚设 - 必须降并发粒度:全局设
repos.packagist.org.concurrent-downloads 2(注意不是http-max-concurrent-downloads) - 必须执行
composer clear-cache,否则旧元数据仍指向 packagist.org,请求根本发不到镜像
项目级 mirrors 配置怎么写才触发故障转移
只改 repo.packagist 是单点配置,不支持自动切换。要让 Composer 在阿里云响应慢时自动切清华源,得用 mirrors 数组 + "canonical": false 组合,且结构不能错。
正确写法是直接编辑项目 composer.json,确保 repositories 是对象(不是数组),并显式声明权威源退居二线:
{
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.org",
"canonical": false
}
},
"mirrors": [
{
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
},
{
"packagist": {
"type": "composer",
"url": "https://mirrors.tuna.tsinghua.edu.cn/composer/"
}
}
]
}
漏掉任意一点都会失效:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"canonical": false必须写在repositories.packagist里,不加就当主源,不走mirrors -
mirrors必须是数组,每个元素是{"packagist": {...}}结构,不能扁平写 URL - 所有镜像 URL 末尾必须带
/,否则拼出packages.json路径时 404
http-max-concurrent-downloads 和 repos.packagist.org.concurrent-downloads 的区别
这两个参数名字像,但作用完全相反:一个为高吞吐设计,一个为抗限流设计,混用会互相抵消。
http-max-concurrent-downloads 控制全局最大并发连接数(默认 6),适合单次拉取量大、镜像稳定、带宽充足的场景;而 repos.packagist.org.concurrent-downloads 是 per-repository 粒度的并发控制,专为应对镜像 QPS 限流设计——设成 2 后,Composer 会对每个镜像源单独限流,配合 mirrors 数组实现轮询分压。
- CI/CD 场景优先用
repos.packagist.org.concurrent-downloads 2,再配多镜像 -
http-max-concurrent-downloads设到 8~10 即可,超过易触发临时文件竞争或 416 错误 - 二者可共存,但若只调高前者却不配
mirrors,等于给单个镜像加压,加速变卡顿
企业 CI 中镜像配置为何总不生效
不是命令没跑,而是配置落错了用户目录。Jenkins、Docker 构建、宝塔任务通常以 jenkins、www 或 runner 用户运行,而 composer config -g 默认写进当前登录用户的 ~/.composer/config.json。root 配的,www 用户根本读不到。
验证方法很简单:进对应环境终端,先 whoami,再 composer config -g repo.packagist。输出为空或仍是 https://packagist.org,就说明配置没到位。
- 临时方案:用
sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 长期方案:放弃全局,统一走项目级
composer.json配置,并显式写"packagist.org": false根节点 - 绝对不要依赖
repositories数组格式([]),它会导致composer config命令报错,必须是对象{}
最常被忽略的一点:镜像 URL 的三个硬性校验点(键名 repo.packagist、type 值显式写出、URL 末尾 /)缺一不可,错一个就静默回退到 packagist.org,且不报错、不提示——你看到的“慢”,其实是根本没走镜像。










