composer diagnose显示ok却install卡在loading composer repositories,是因为diagnose仅对packagist.org发http head请求,不校验https、不读镜像配置、不模拟真实链路;真正问题常是dns解析失败或tls握手卡住,需用composer show -p或curl验证镜像,优先检查openssl证书路径和系统dns。

composer diagnose 显示 OK 却 install 卡在 Loading composer repositories
这不是 diagnose 有问题,而是它根本没测你实际要用的链路。它只对 https://packagist.org 发一次 HEAD 请求,走的是 HTTP(80 端口),不校验 HTTPS(443)、不读你的镜像配置、也不模拟真实依赖解析流程。
常见脱节点:
- 你配了阿里云镜像:
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/,但composer diagnose仍硬连官方源,完全不生效 - 卡在
Loading composer repositories阶段,本质是 DNS 解析失败或 TLS 握手卡住,http.timeout参数此时完全不起作用 - 想验证镜像是否真可用,别信 diagnose,改用:
composer show -p | head -5或直接curl -I https://mirrors.aliyun.com/composer/packages.json
curl error 60 / 35 出现在 diagnose 输出里怎么定位
这是 OpenSSL 层面的信任链断裂,不是 Composer 配错了,也不是网络被墙——PHP 不知道该信谁。
必须分两步查:
- 先看 PHP 实际加载的证书路径:
php -r "print_r(openssl_get_cert_locations());",重点盯default_cert_file是否存在、可读 - 路径为空或文件损坏?下载最新 Mozilla CA 包覆盖它:
curl -o /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem(路径按上一步输出调整) - 然后在
php.ini里加一行:openssl.cafile=/etc/ssl/certs/ca-certificates.crt,重启 PHP 进程 - 别用
composer config --global cafile—— 那只影响 Composer 自己的 HTTP 客户端,diagnose不走这条路
Connection timed out 卡在 Resolving dependencies 怎么破
这个阶段根本没发 HTTP 请求,是 DNS 或系统网络层卡死,调 http.timeout 没用。
优先级顺序不能乱:
- 先跑
ping packagist.org:返回unknown host→ DNS 解析失败,立刻换 DNS(比如 Linux 改/etc/resolv.conf加nameserver 8.8.8.8) - 能 ping 通但
curl -I https://packagist.org卡住 → 可能是代理拦截、防火墙屏蔽,或 TLS 握手失败;手机热点一试便知 - 确认是否企业/校园网策略屏蔽:
curl -I https://github.com也失败?大概率是网络策略问题 -
composer clear-cache必须做——旧缓存里的错误地址可能还在内存里,换镜像后不清理等于白配
换了镜像还报错,怎么确认配置是否真正生效
Composer 查源顺序是:项目级 composer.json 中的 repositories > 全局配置 repo.packagist > 默认官方源。很多人设了全局镜像,却被项目里硬编码的私有源覆盖。
实操检查点:
- 查全局是否生效:
composer config -g repo.packagist - 查当前项目是否覆盖:
composer config repo.packagist(不加-g) - 阿里云镜像正确地址是
https://mirrors.aliyun.com/composer/,末尾斜杠不能少;清华镜像同理,少/会返回 404 - CI 环境特别容易踩坑:shell 配置未加载,
diagnose可能读不到$HOME下的配置,得显式设置COMPOSER_HOME和openssl.cafile
最常被忽略的其实是证书路径和 DNS 优先级——前者让 SSL 错误反复出现,后者让所有超时调参都失效。动手前先跑两行命令:php -r "print_r(openssl_get_cert_locations());" 和 ping packagist.org,比盲目改配置快得多。











