composer不支持多镜像自动fallback,repositories数组仅为元数据合并顺序,仅首个返回200且含合法json的源生效,404才试下一个;超时、502等错误直接中断,需脚本探测+切换+清缓存实现容灾。

composer.json里写多个repositories不是配置“多个镜像”,而是定义元数据合并顺序
你在composer.json中添加多个{"type": "composer", "url": "https://..."},Composer不会把它当“备用源”或“负载均衡池”,只会按数组从上到下请求每个源的/packages.json,把所有包信息合并成一张索引表。但关键限制是:只要第一个源返回 HTTP 200 + 合法 JSON(哪怕不含你要的包),Composer 就锁定它,后续所有源都不再访问。
常见错误现象:
- 写了阿里云、腾讯云、官方源三个源,但网络一抖就报
Could not fetch https://packagist.org/packages.json——因为官方源排第一,且未返回 404,只是超时或 502,Composer 直接退出,根本不试下一个 - 删掉
"packagist.org": false后,即使写了镜像,Composer 仍偷偷连https://packagist.org,导致安装卡死 - URL 少了末尾
/(如https://mirrors.aliyun.com/composer),请求/packages.json时 404,整个源被跳过
repo.packagist 是单值字段,反复 config -g 只会覆盖,不会叠加
composer config -g repo.packagist底层绑定的是一个字符串字段,不是数组。执行:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ composer config -g repo.packagist composer https://mirrors.tencent.com/composer/
第二条命令会直接覆盖第一条,~/.composer/config.json里只存着腾讯云的地址。不存在“主备自动切换”,也不存在“某版本支持多值”。
必须注意的硬性细节:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 必须带
composer这个type值,漏掉就静默失效(例如composer config -g repo.packagist https://xxx不生效) - 键名只能是
repo.packagist(单数、全小写、无s),写成repos.packagist或repository.packagist都无效 - URL 必须是 HTTPS 且以
/结尾,华为云还要额外包含/repository/php/路径 - 不加
-g只改当前项目,换目录就失效
真要容灾,得靠外部脚本完成探测 → 切换 → 清缓存三步闭环
Composer 自身不提供故障转移能力。CI/CD 或本地开发中防止单点失效,唯一可靠路径是自己控制流程:
- 用
curl -I -s -o /dev/null -w "%{http_code}" https://mirrors.aliyun.com/composer/packages.json检查是否返回200 - 成功则运行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 失败则 fallback 到备用地址,并再次探测
- 每次切换后必须执行
composer clear-cache——否则 DNS 缓存、HTTP 连接池、旧元数据仍可能导致请求继续失败
漏掉clear-cache是最容易被忽略的环节:你以为切了源,实际请求还在走旧缓存里的地址。
项目级配置比全局配置更可控,但必须删 vendor 和 lock 文件重装
进项目目录后执行composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g),会把源写入composer.json的repositories对象中,优先级高于全局配置,且克隆即用。
但要注意:
- 如果
composer.json里已有"repositories": [](数组),该命令会失败;需先手动改为"repositories": {}(空对象) - 改完必须删除
vendor/和composer.lock,否则composer install仍按 lock 文件里记录的旧源地址拉取——镜像只影响下载行为,不改 lock 内容 - 若项目已定义
repositories数组,则全局配置repo.packagist完全被忽略,不是合并关系










