composer install/update 报错 failed to decode response 或 could not resolve host 是 dns 解析失败所致,需先验证 ping/nslookup repo.packagist.org 是否通,再排查系统 dns、hosts 绑定、curl 配置及网络环境。

Composer install/update 报错 Failed to decode response: Failed to open TCP connection 或 Could not resolve host: repo.packagist.org
这基本是 DNS 解析失败导致的,不是 Composer 本身出错,而是它发 HTTP 请求时连不上 Packagist 的域名。常见于国内网络环境、企业内网、或系统 DNS 配置异常的场景。
验证方式很简单:在终端运行 ping repo.packagist.org 或 nslookup repo.packagist.org。如果返回 Unknown host 或超时,就确认是 DNS 问题。
- 别急着换源——先确认是不是本地 DNS 根本没响应
- 别只改
composer.json——DNS 层面不通,换镜像源也白搭 - Windows 用户注意:WSL 和宿主机 DNS 可能不一致,要分别排查
Linux/macOS 下临时绕过系统 DNS,强制用 8.8.8.8 解析
Composer 底层用 PHP 的 curl 或 stream 发请求,它们默认走系统 DNS。你可以临时让整个命令走指定 DNS,不用改系统配置:
执行前加 export COMPOSER_NO_SSL=1(仅调试用,不推荐长期开启)并配合 dig 或 curl 测试通路更直接。但最稳的临时解法是:
- 运行
composer config -g repo.packagist composer https://packagist.org(确保源地址正确) - 然后用
curl -v https://repo.packagist.org/packages.json 2>&1 | grep "Connected to"看是否能连上 IP - 如果
curl也失败,说明是 DNS 或防火墙问题;成功则 Composer 自身可能被代理/SSL 设置干扰
Windows 上 hosts 文件硬解析 repo.packagist.org
当 DNS 不可靠又无法修改网络设置时,手动绑定 IP 是最快见效的方式。Packagist 官方域名目前主要解析到 Cloudflare 节点,IP 会变,所以得先查实时地址:
打开 CMD,运行:nslookup repo.packagist.org 8.8.8.8
记下返回的 IPv4 地址(如 104.21.46.17),然后编辑 C:\Windows\System32\drivers\etc\hosts(需管理员权限),追加一行:
104.21.46.17 repo.packagist.org
- 别写错格式:IP 在前、域名在后,中间用空格或 Tab 分隔
- 改完 hosts 后,必须清空本地 DNS 缓存:
ipconfig /flushdns - 某些安全软件会锁定 hosts 文件,保存失败时检查是否有防护进程拦截
PHP cURL 扩展启用 CURLOPT_DNS_USE_GLOBAL_CACHE = false 的影响
这不是 Composer 配置项,而是底层 PHP cURL 行为。如果系统全局 DNS 缓存异常(比如某些虚拟化环境或容器中),cURL 可能复用错误的旧解析结果,导致 Composer 卡在“已连上但收不到响应”状态。
你无法直接在 Composer 命令里传这个参数,但可以:
- 检查 PHP 是否启用了 cURL:
php -m | grep curl - 确认
curl.cainfo指向有效的 CA 证书路径(否则 HTTPS 握手失败也会表现为 DNS 错误) - 在容器或 CI 环境中,优先用
--network=host或显式配置/etc/resolv.conf,比修 PHP 层更可控
真正卡住的时候,往往不是缺某个开关,而是 DNS 查询链路上某一层静默失败了——比如 systemd-resolved 服务挂了、Docker 默认用 127.0.0.11 但没跑 dnsmasq、或者公司代理劫持了 53 端口却没转发 UDP 查询。










