卡在Resolving dependencies大概率是DNS问题,因该阶段仅做域名解析和本地依赖图计算,不发HTTP请求;可运行ping packagist.org验证,若返回unknown host即确认DNS失败,应优先更换DNS(如8.8.8.8)或切换国内镜像源。

卡在Resolving dependencies一定是DNS问题吗
不一定,但90%是。这个阶段不发HTTP请求,只做域名解析和本地依赖图计算;如果composer install -vvv停在Resolving dependencies且后续无日志,基本可锁定为DNS失败或超时。常见现象包括:Could not resolve host packagist.org、getaddrinfo failed,或干脆静默卡住1–3分钟才报错。
验证方法极简:ping packagist.org。返回unknown host即确认DNS失败;返回IP但curl -I https://packagist.org卡住,则是防火墙或TLS拦截——别急着调http.timeout,它对这一步完全无效。
- 优先换公共DNS:临时改
/etc/resolv.conf(Linux/macOS)或网络适配器 → IPv4属性 → DNS服务器(Windows),填8.8.8.8或223.5.5.5 - Docker容器内需显式指定:
docker run --dns 8.8.8.8 your-image composer install - 公司/学校网络若统一屏蔽
packagist.org,换DNS也没用——此时必须切镜像源,而非死磕DNS
IPv6 fallback导致“卡住但不报错”怎么抓
这是最隐蔽的DNS相关卡顿:Composer默认先尝试IPv6地址,超时(通常1–3秒)再fallback到IPv4。一个项目拉上百个包,叠加起来就是几分钟无响应,-vvv日志里却看不到明显错误。
验证方式:curl -v https://packagist.org 2>&1 | grep "Connected to"。如果看到类似Connected to packagist.org (2a03:2880:...)且后续卡住,基本就是IPv6 fallback在拖慢。
- 临时禁用IPv6:Linux/macOS执行
sysctl -w net.ipv6.conf.all.disable_ipv6=1;Windows可在网络适配器中取消勾选“Internet协议版本6(TCP/IPv6)” - 更推荐方案:直接换镜像源。清华、阿里云等国内镜像均无IPv6 fallback问题,且本身不走境外节点
- 不要依赖
composer config -g http.timeout来缓解——它只影响HTTP请求阶段,对DNS解析阶段零作用
镜像源配了但还是走packagist.org怎么办
镜像没生效,90%是被缓存或更高优先级配置覆盖了。Composer的配置优先级是:项目级composer.json > 全局config -g > 环境变量。即使你跑了composer config -g repo.packagist ...,只要项目根目录composer.json里写了repositories,就会直接忽略全局设置。
- 检查是否真生效:
composer config -g repo.packagist(看全局)和composer config repo.packagist(不加-g,看当前项目)输出必须一致且为镜像URL - 必须清缓存:
composer clear-cache,否则仍可能从~/.composer/cache读取旧地址 - 清华镜像URL末尾必须带斜杠:
https://mirrors.tuna.tsinghua.edu.cn/composer/,少一个/就返回404 - 旧版Composer(1.x)不识别
repo.packagist,得用composer config -g repos.packagist '{"type":"composer","url":"https://mirrors.aliyun.com/composer/"}'
为什么改DNS后curl通了,composer still fails
因为Composer在DNS之上还多了一层:它会复用PHP自身的default_socket_timeout和openssl.cafile配置。DNS通了,不代表TLS握手能过,也不代表PHP能连上自己缓存的IP。
- 检查PHP配置:
php -r "var_dump(ini_get('default_socket_timeout'));",若低于300,需在php.ini中设为default_socket_timeout = 600 - 证书问题:
curl -I https://packagist.org成功但composer diagnose报SSL certificate problem,说明PHP未加载CA证书;可临时设export COMPOSER_CAFILE=/etc/ssl/certs/ca-certificates.crt(Linux) - hosts文件冲突:若手动在
/etc/hosts里绑定了packagist.org旧IP,而该IP已下线,会导致“解析成功但连接拒绝”,删掉对应行即可 - WSL2用户注意:
resolv.conf可能被自动覆盖,需在/etc/wsl.conf中加[network] generateResolvConf = false


















