Composer 不支持配置专用 DNS,卡在 Resolving dependencies 是因系统 DNS 解析失败;需在容器、系统或网络层修改 DNS,而非 composer.json 或 composer config。

Composer 本身不支持配置专用 DNS,所有 DNS 解析由 PHP 进程或系统底层完成,你无法在 composer.json 或 composer config 中指定 DNS 服务器。
为什么 composer install 卡在 Resolving dependencies 后突然卡住?
这不是 Composer 在“解析依赖”,而是 PHP 底层发起的 DNS 查询卡住了 —— 比如尝试解析 packagist.org、github.com 或镜像域名时,系统默认 DNS(如运营商 DNS)响应慢或返回失败。此时 composer install -vvv 日志可能停在 Reading ./composer.json 之后、尚未出现 Downloading,说明问题出在元数据获取前的域名解析阶段。
- 常见现象:执行
composer config -g repo.packagist能立刻返回,但composer install卡住不动,Ctrl+C后看到堆栈停留在getaddrinfo或cURL error 6 - 验证方式:终端直接运行
nslookup mirrors.aliyun.com或dig mirrors.tuna.tsinghua.edu.cn,若超时或无响应,基本可定位为 DNS 问题 - 根本原因:PHP 的 cURL 或 stream 扩展调用系统
getaddrinfo(),而该函数受系统 DNS 配置控制,Composer 无干预能力
真正有效的 DNS 优化手段只有三种
必须绕过 Composer 层,在更低层级强制生效:
-
容器内运行时显式指定 DNS:Docker 启动时加
--dns 8.8.8.8 --dns 1.1.1.1,或在/etc/docker/daemon.json中配置"dns": ["8.8.8.8", "114.114.114.114"] -
宿主机系统级修改:Linux/macOS 改
/etc/resolv.conf(注意某些发行版会覆盖它,需配合systemd-resolved或NetworkManager);Windows 改网络适配器 IPv4 属性中的 DNS 服务器 -
PHP 进程启动前注入环境变量(仅部分场景有效):某些 Linux 发行版支持
export SYSTEMD_RESOLVE=1或设置GODEBUG=netdns=go(对 PHP 无效),但 PHP 本身不读取此类变量 —— 所以这条路走不通,别白费劲
别信“在 composer.json 里配 DNS”这类误导
网上有些教程说在 repositories 里写 "options": {"dns": "8.8.8.8"} 或用 composer config 设置 dns-server —— 这些字段 Composer 完全不识别,也不会报错,只会静默忽略。Composer 的配置 Schema 中不存在任何 DNS 相关字段,官方文档也从未提及。
- 错误示例:
composer config -g extra.dns-server 8.8.8.8→ 写进去了也没用 - 混淆来源:有人把 Node.js 的
dns.setServers()或 Python 的dnspython用法套到了 PHP 上 - 真实替代方案:如果公司内网有自建 DNS 缓存服务(如 dnsmasq),可将镜像域名(如
mirrors.aliyun.com)做 A 记录硬解析,比全局换 DNS 更精准
DNS 是网络栈最底层的一环,Composer 只是上层应用。想让它快,就得在它还没启动之前,就把解析路径理顺。改错层级,再配一百遍 composer config 都没用。











