Composer fallback本质是线性扫描,仅在源返回HTTP 404时尝试下一源;遇超时、502、DNS失败等直接报错退出,不自动切换。需显式配置repositories数组,将阿里云镜像置前、{"packagist.org": false}独立置后,并确保URL末尾带/。

Composer fallback 本质是线性扫描,不是自动重试
Composer 没有“网络失败自动切下一个源”的能力。它只在某个源明确返回 HTTP 404(包完全不存在)时,才继续查 repositories 数组里的下一个源;遇到超时、502、503、DNS 解析失败或 500,直接报错退出,根本不会看第二个源。
所以所谓“fallback”,实际是「元数据阶段的顺序匹配」,不是下载阶段的容灾机制。
-
repositories数组必须显式声明所有源,包括镜像和官方源 - 必须把镜像 URL 放在数组前面,官方源放后面
- 必须加
{"packagist.org": false}作为独立对象放在数组末尾——漏掉、写错 key(比如"packagist": false)、放错位置(比如放开头),都会导致 Composer 偷偷回连官方源 - 项目级
composer.json中定义了repositories,全局配置(~/.composer/config.json)就完全失效
正确写法:阿里云镜像 + 官方源协同的 repositories 配置
想让阿里云镜像优先,官方源仅作兜底(且只对 404 生效),composer.json 的 repositories 必须长这样:
"repositories": [
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
},
{
"packagist.org": false
}
]
注意三点:
- URL 末尾 必须带
/,写成https://mirrors.aliyun.com/composer会拼出错误路径如/composerpackages.json,触发静默 fallback 到官方源 -
{"packagist.org": false}是独立对象,不能合并进上一个仓库配置里,也不能写成{"packagist": false} - 这个配置只影响元数据索引(
packages.json合并),不改变 ZIP 包下载行为——如果镜像返回了包信息但 dist-url 指向 GitHub,下载仍可能卡住
为什么改了 repositories 却还是连 packagist.org?
最常见原因是没关掉隐式兜底源。即使你把阿里云镜像写在第一位,只要它对某个包返回 404,Composer 就立刻启用默认行为,偷偷去 https://packagist.org 查——你以为是 fallback,其实是被设计“放行”了。
验证方式很简单:
- 运行
composer config repositories,输出里如果还出现https://repo.packagist.org或https://packagist.org,说明{"packagist.org": false}没生效 - 删掉
vendor/和composer.lock,再跑composer install -vvv,日志中第一处Downloading的域名必须是mirrors.aliyun.com才算真正走镜像 - 如果日志里出现
GET https://packagist.org/packages.json,说明配置被覆盖或忽略,立刻检查项目级composer.json是否存在repositories字段
真容灾需要外部控制流,不是靠 config
如果你的场景是「镜像不可用时自动切腾讯云」,Composer 原生做不到。它的 repo.packagist.org 配置项是单值字段,后一次 composer config -g repo.packagist ... 会直接覆盖前一次,没法存两个地址。
可行做法只有两种:
- 用脚本探测镜像可用性(比如
curl -I -s https://mirrors.aliyun.com/composer/packages.json | head -1),根据状态码动态执行composer config -g repo.packagist composer https://...并清缓存 - CI/CD 中用环境变量控制源地址,配合
composer config repo.packagist ...(不加-g)写入项目级配置,再删composer.lock重装
别试图在 repositories 里塞多个 composer 类型源来模拟 fallback——Composer 只从第一个声明该包的源下载 ZIP,其余源全程不参与下载阶段。











