composer diagnose 报“http connectivity to packagist: fail”不表示镜像失效,因其硬编码只测 https://packagist.org,完全忽略所有镜像配置;验证镜像是否生效应运行 composer show -p | head -5 或 curl -i https://mirrors.aliyun.com/composer/packages.json。

换镜像源后 composer diagnose 仍报 “http connectivity to packagist: FAIL”,不是镜像没生效,而是 composer diagnose 根本不读你配的镜像——它硬编码只连 https://packagist.org,测的是官方源通不通,跟你配的阿里云、腾讯云毫无关系。
为什么 diagnose 显示 FAIL 但 install 能跑
composer diagnose 的设计目标是验证 Composer 自身基础环境是否“能安全启动”,不是验证你实际用的源。它会:
- 强制发起 HTTP 请求(非 HTTPS)到 packagist.org
- 完全忽略 composer config -g repo.packagist 配置
- 不读 composer.json 里的 repositories 字段
- 不认 COMPOSER_REPO_PACKAGIST 环境变量
所以即使你已成功切到 https://mirrors.aliyun.com/composer/,diagnose 依然会去连被墙的 packagist.org,然后报 FAIL。
怎么验证镜像真生效了
别信 diagnose 的输出,直接看实际行为:
- 运行 composer show -p | head -5:它会真实走你配置的源,如果返回包列表且域名是 mirrors.aliyun.com,说明镜像已生效
- 手动 curl 测试元数据接口:curl -I https://mirrors.aliyun.com/composer/packages.json,应返回 200 OK
- 执行 composer install -v,观察日志里下载地址是否为镜像域名(如 Downloading https://mirrors.aliyun.com/composer/dist/...)
- 若仍卡在 Resolving dependencies,问题不在镜像,而在 PHP 版本约束过宽或 require-dev 包太多
想让 diagnose 测镜像?临时改配置
如果你非要让 diagnose 测镜像(比如 CI 中需要通过检查),只能临时绕过它的硬编码逻辑:
- 先取消全局镜像配置:composer config --global --unset repos.packagist
- 再运行 composer diagnose,此时它会 fallback 到你项目级 composer.json 里的 repositories(如果有)
- 或者更直接:在项目根目录下删掉 repositories 里对 packagist.org 的屏蔽项(如 "packagist.org": false),否则 diagnose 会因找不到可用源而失败
注意:diagnose 永远不会主动用你设的 repo.packagist 键——它只认 repos.packagist(复数),这是历史兼容写法,但已被弃用
真正要盯住的不是 diagnose,而是 DNS 和 CA 证书
当 diagnose 报 FAIL 时,90% 的真实瓶颈不在 Composer 配置,而在底层:
- dig packagist.org +short 返回 127.0.0.1 或空 → DNS 劫持,换 DNS(如 114.114.114.114)
- curl -I https://packagist.org 卡住或报 Connection refused → 防火墙拦截,手机热点一试便知
- php -r "print_r(openssl_get_cert_locations());" 中 default_cert_file 路径不可读 → CA 证书失效,需手动下载并配置 openssl.cafilediagnose 的 FAIL 只是个信号灯,它不告诉你红灯亮是因为路堵了还是红绿灯坏了——得自己下车看。











