Composer不支持自动fallback,必须显式配置"canonical": false才能启用多镜像轮询;元数据缓存默认15分钟不过期,需用composer update --refresh(≥2.5)强制刷新,否则无法拉取安全更新。

突发大规模安全更新时,单纯换镜像源没用——关键得让 Composer 在源失效时自动 fallback,同时确保元数据能实时刷新。否则你改了镜像,composer update 还是卡在旧缓存里,根本拉不到新补丁。
为什么换镜像后 composer update 仍不生效?
根本原因不是源地址错,而是 Composer 默认复用 15 分钟内不过期的元数据缓存(packages.json)。哪怕阿里云镜像站已同步了 monolog/monolog 的安全补丁 3.6.1,你本地缓存里还是 3.6.0 的版本列表,composer update 就不会去查新版本。
- 检查当前镜像是否生效:
composer config -g repo.packagist.org - 确认缓存路径:
composer config --global cache-dir - 进缓存目录看元数据是否陈旧:
ls -l $(composer config --global cache-dir)/repo/https---mirrors.aliyun.com-composer/
多镜像 fallback 必须配 canonical: false
只在 composer.json 的 repositories 里堆 URL 没用。Composer 默认按顺序匹配,找到第一个能连通的就停,不会自动试下一个——除非你显式关掉 canonical 行为。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 正确写法(顺序无关):
{ "repositories": [ { "type": "composer", "url": "https://mirrors.tuna.tsinghua.edu.cn/composer/", "canonical": false }, { "type": "composer", "url": "https://mirrors.aliyun.com/composer/", "canonical": false }, { "type": "composer", "url": "https://mirrors.cloud.tencent.com/composer/", "canonical": false } ] } -
"canonical": true(或省略)会让 Composer 只认第一个源,后面全被忽略 - 缺
canonical: false,就算三个镜像都写上,也等同于单点
composer update --refresh 是安全更新的刚需操作
它只清元数据缓存(packages.json 和 provider-*.json),不碰已下载的 ZIP 包,比 composer clear-cache 更精准、更快。
- 必须用 Composer ≥ 2.5,老版本不支持
- 执行后立刻跟
composer update vendor/package,才能识别并安装安全补丁 - 如果项目级
repositories配置覆盖了全局镜像,--refresh会按项目配置拉取,别忘了检查:composer config --list | grep repositories
CI 流水线里必须加 shell fallback + 缓存挂载
全局 composer config -g repo.packagist.org 是覆盖式单值写入,不能自动轮询。真实容灾得靠外部逻辑兜底。
- CI 脚本里加重试循环:
for mirror in "https://mirrors.aliyun.com/composer/" "https://mirrors.tuna.tsinghua.edu.cn/composer/"; do composer config -g repo.packagist.org "$mirror" && break || sleep 2 done
- 把
~/.composer/cache挂载进 CI 容器,复用 dist 包缓存,避免每次重拉 - 私有项目务必提交
composer.lock,它绕过元数据查询,直接按锁定版本安装,天然抗源抖动
最容易被忽略的一点:所有镜像都同步自同一个上游(比如 packagist.org),上游一挂,再多个镜像也没用。真正高可用,得组合异构源(如一个公有镜像 + 一个本地 Satis)或加代理层健康检查——这已经超出 Composer 自身能力范围了。

















