composer 2.0+镜像配置必须严格满足三要素:键名repo.packagist、type值为composer、url以/结尾,缺一即静默失效;且镜像站须支持sha256哈希透传,否则报hash mismatch或invalid package information。

升级到 Composer 2.0 后,镜像源配置不仅“有变”,而且是**协议级不兼容**——旧写法会静默失效或直接报 Invalid package information,不是网络问题,是校验机制变了。
composer config -g repo.packagist 必须带 type 和结尾斜杠
Composer 2.0+ 不再接受裸 URL,必须显式声明 type 为 composer,且 URL 末尾必须带 /。漏掉任一要素,配置就形同虚设:
-
composer config -g repo.packagist https://mirrors.aliyun.com/composer❌ 缺少composertype,写入的是字符串而非仓库对象,后续composer config -g repo.packagist输出会是纯 URL,镜像不生效 -
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer❌ 缺少结尾/,请求变成https://mirrors.aliyun.com/composer/packages.json(404),实际走回源 -
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/✅ 正确写法,type 和路径都合规
镜像站必须支持哈希透传,否则报 hash mismatch
Composer 2.5+ 强制校验 provider 文件的 sha256 哈希值,旧式镜像(如 phpcomposer.com)靠硬替换 URL 的方式已彻底失效。现象是:Invalid package information 或 hash mismatch in provider file。
- 阿里云镜像自 2025 年 Q3 起默认启用透传,开箱即用
- 腾讯云需手动开启:执行
composer config -g repos.packagist.options.verify-signature true - 清华镜像(tuna)目前不支持透传,
composer install可能部分失败,尤其涉及require-dev或私有包时 - 验证是否生效:运行
composer install -vvv,看日志是否出现Downloading https://mirrors.xxx.com/composer/... (10 concurrent),且无哈希相关报错
CI 中别用全局 config,改用 -d 或环境变量
CI 环境复用缓存或基础镜像时,composer config -g 写入的全局配置(~/.composer/config.json)会被继承,前序 job 配了不兼容镜像,当前 job 就会卡住,且无提示。
- 安全做法:每次构建前先清理,
composer config -g --unset repos.packagist - 更推荐临时指定:
composer install -d /tmp/composer-config(用独立配置目录) - 或用环境变量:
COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/ composer install - 绝对避免在 Dockerfile 中写
RUN composer config -g ...,它污染基础镜像
换源后必须 clear-cache,否则元数据仍走 packagist.org
镜像只加速新请求,旧缓存里的 packages.json 还指向 packagist.org,Composer 会继续用它拉 provider 列表,结果仍是慢速回源。
- 执行
composer clear-cache是换源后的强制步骤,不是可选项 - 如果之前用过已停服的镜像(如
https://packagist.phpcomposer.com),缓存里可能残留失效地址,清缓存尤其关键 - 清完 cache 后,首次
composer install会重新从镜像站拉取完整索引,耗时略长但只一次 - 若仍卡在
Downloading packages.json,检查是否漏清 cache,或镜像站本身未适配透传
真正麻烦的不是配置怎么写,而是镜像站是否已升级协议——很多团队换源后反复重试、换网络、重装 PHP,其实问题出在镜像站没开透传或签名验证。确认这点比调参数重要得多。











