答案:Composer本身不解析DNS,卡在Resolving dependencies或Downloading阶段的“DNS慢”实为PHP底层cURL或stream封装器发起HTTP请求前的系统级域名解析延迟,需更换低延迟DNS(如8.8.8.8或114.114.114.114)并联动配置镜像源、http.timeout及PHP default_socket_timeout才能彻底提速。

Composer 本身不解析 DNS,卡在 Resolving dependencies 或 Downloading https://... 阶段时出现的“DNS 慢”,其实是 PHP 底层 cURL 或 stream 封装器在发起 HTTP 请求前做的域名解析 —— 这个环节被系统 DNS 配置拖慢,而 Composer 完全无法干预。
为什么改 DNS 能让 composer install 快起来
国内默认运营商 DNS(如 114.114.114.114)对境外域名(packagist.org、github.com)解析不准、缓存陈旧、甚至返回错误 IP;清华/阿里镜像源虽在国内,但其 CDN 域名(如 mirrors.tuna.tsinghua.edu.cn)若被本地 DNS 错误解析到非边缘节点,也会绕行。实测中,DNS 解析耗时从 200ms+ 降到 10ms 内,可减少整体安装时间 3–8 秒(尤其在 CI 或首次构建时)。
- 不是 Composer 的 bug,是系统级网络基础设施问题
- 换镜像源(如清华源)必须配合低延迟 DNS 才能发挥全部效果
-
composer config -g repo.packagist设对了,但 DNS 解析卡住,照样卡在第一行日志
如何验证当前 DNS 是否拖慢 Composer
执行以下命令观察真实解析耗时:
time nslookup packagist.org time nslookup mirrors.tuna.tsinghua.edu.cn time nslookup github.com
若任一结果 >100ms,或返回 IP 明显不属于国内机房(比如解析出德国、美国 IP),就该换 DNS。更直接的方式是加 -vvv 运行:
composer install -vvv 2>&1 | grep -E "GET|HEAD"
看请求 URL 对应的域名是否解析到了高延迟 IP(例如 mirrors.tuna.tsinghua.edu.cn 解析成北京节点却连到了广州出口)。
Docker 容器内 DNS 失效的典型表现与修复
很多 PHP 镜像(尤其是 Alpine 基础镜像)默认用的是 /etc/resolv.conf 中的 nameserver 127.0.0.11(Docker 内置 DNS),它在某些内网环境或老旧 Docker 版本下会超时或返回 NXDOMAIN。
- 现象:
composer install卡在Resolving dependencies,且nslookup packagist.org超时 - 临时修复:启动容器时指定公网 DNS:
docker run --dns 8.8.8.8 --dns 114.114.114.114 your-php-app - 长期修复:在
/etc/docker/daemon.json中添加:{"dns": ["223.5.5.5", "119.29.29.29"]}(阿里 DNS + 腾讯 DNS),然后sudo systemctl restart docker - Alpine 镜像注意:部分精简版无
nslookup,可用apk add bind-tools临时安装验证
比换 DNS 更关键的协同动作
只改 DNS 不够,必须和镜像源、HTTP 超时、并发配置联动才有效:
- 确认镜像已生效:
composer config -g repo.packagist输出必须是https://mirrors.tuna.tsinghua.edu.cn/composer/或https://mirrors.aliyun.com/composer/,不是空或https://packagist.org - 同步调高
http.timeout:DNS 快了,但 TLS 握手或首字节延迟仍可能触发超时,执行composer config -g http.timeout 600 - PHP 的
default_socket_timeout必须 ≥http.timeout:运行php -i | grep default_socket_timeout,若为 60,需在 CLI 启动时覆盖:php -d default_socket_timeout=600 $(which composer) install - 避免
repositories项目级覆盖:检查composer.json里有没有自定义repositories,有则删掉或改成镜像地址,否则全局镜像配置会被无视
DNS 是链路最前端的闸门,但它不会自动优化后续环节;一旦解析快了,http.timeout 和 PHP socket 限制就立刻变成新瓶颈 —— 这也是最容易被忽略的接力点。











