composer不支持多仓库自动回退,仅使用第一个源;可靠容灾需三步闭环:探测packages.json可用性、用composer config -g repo.packagist composer url切源、立即clear-cache;项目级repositories会覆盖全局配置,须检查并清理缓存。

为什么直接写多个 repositories 不会自动 fallback
你在 composer.json 里写一堆中文镜像,比如:
"repositories": [
{"type":"composer","url":"https://mirrors.aliyun.com/composer/"},
{"type":"composer","url":"https://mirrors.cloud.tencent.com/composer/"}
]
结果是:Composer 只查第一个;它返回 404 或超时,就报错 Could not fetch packages,绝不会试第二个。这不是 bug,是设计——官方明确拒绝多源 fallback(GitHub issue #8729)。
更糟的是,如果两个源元数据不一致(比如同一包版本号不同),还可能触发 Package could not be found 冲突。
真正能用的容灾脚本要做什么
可靠容灾必须三步闭环:探测 → 切源 → 清缓存。漏任何一步,都会卡在旧镜像或缓存里。
- 探测必须用
curl -s -f -m 10 $URL/packages.json,不能只看域名是否 ping 通(HTTP 层才决定 Composer 能否拿到元数据) - 切源必须用
composer config -g repo.packagist composer $URL,中间的composer类型参数不能省,否则静默回退官方源 - 清缓存必须紧跟切换后执行
composer clear-cache,否则packages.json还是旧的,composer update仍找不到新版本
示例脚本片段(Linux/macOS):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
MIRRORS=(
"https://mirrors.aliyun.com/composer/"
"https://mirrors.cloud.tencent.com/composer/"
"https://repo.huaweicloud.com/repository/php/"
"https://packagist.org"
)
for url in "${MIRRORS[@]}"; do
if curl -s -f -m 10 "$url/packages.json" >/dev/null; then
composer config -g repo.packagist composer "$url"
composer clear-cache
echo "✅ switched to $url"
exit 0
fi
done
echo "❌ all mirrors failed"
exit 1
项目级配置会屏蔽全局设置
哪怕你全局切好了阿里云,只要项目 composer.json 里有 "repositories" 字段(哪怕空数组 []),Composer 就完全忽略 repo.packagist,只认项目里的源。
检查方法:
- 运行
composer config repo.packagist(不加-g),输出不是空,说明被项目级覆盖了 - 用
grep -A 5 '"repositories"' composer.json快速定位是否存在该字段 - 临时绕过:进项目目录后直接执行
composer config repo.packagist composer https://packagist.org
验证是否真在用目标镜像
别信 composer config -g repo.packagist 的输出,它只告诉你“配了什么”,不等于“正在用什么”。真实证据只有网络请求 URL:
- 运行
composer require monolog/monolog --no-install -vvv - 找日志里那行
Downloading https://...—— 地址必须是你设的镜像或repo.packagist.org - 同时核对
composer diagnose输出中Repo:行的域名是否匹配
最常被忽略的是缓存残留和项目级 repositories 干扰,这两点不清理,脚本再健壮也白搭。










