答案:Composer卡在DNS解析主因是IPv6 fallback机制,非域名本身难解析;默认先试IPv6地址(如2a03:2880:...),超时1–3秒后才退至IPv4,80+包叠加致数分钟无响应,且不报错。

直接换镜像源比调DNS更有效,但DNS问题不解决,镜像也可能卡住——尤其在公司网络或IPv6 fallback场景下。
为什么composer install卡在DNS解析阶段
不是packagist.org域名本身难解析,而是Composer默认行为会先尝试IPv6地址(如2a03:2880:...),超时(通常1–3秒)后才fallback到IPv4。一个项目拉80+个包,叠加就是几分钟无响应;日志里不报错,只显示“Resolving dependencies”长期不动。
验证方法:curl -v https://packagist.org 2>&1 | grep "Connected to",如果看到IPv6地址且后续卡住,基本锁定问题。
- 公司/学校网络常禁用IPv6或丢弃ICMPv6,导致fallback失败
- DNS服务器(如本地ISP提供)返回缓慢或乱序的AAAA记录,加剧等待
- PHP的
file_get_contents()底层不支持自定义DNS超时,只能被动等
换DNS不如关IPv6来得快
改系统DNS(比如切8.8.8.8)对Composer效果有限,因为它的HTTP请求走的是cURL或PHP stream,不直用系统resolv.conf;真正起效的是绕过IPv6尝试环节。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时禁用IPv6:Linux/macOS运行
sysctl -w net.ipv6.conf.all.disable_ipv6=1(重启失效) - 强制cURL走IPv4:
export CURL_IPRESOLVE=4,再跑composer install - Git也受影响:执行
git config --global url."https://".insteadOf "git://",避免git clone阶段触发IPv6 DNS查询
composer config -g repo.packagist配错URL会导致DNS二次失败
清华、阿里云等镜像URL末尾必须带/,例如https://mirrors.tuna.tsinghua.edu.cn/composer/。少一个/,Composer会把路径拼成https://mirrors.tuna.tsinghua.edu.cn/composer/packages.json(正确),但若配置错误,它可能退化为https://mirrors.tuna.tsinghua.edu.cn/composerpackages.json(404),进而触发DNS重查甚至fallback到packagist.org。
- 检查是否生效:
composer config -g repo.packagist,输出必须是完整HTTPS URL且以/结尾 - 旧版Composer(1.x)需用
repos.packagist(复数),否则静默忽略 - 项目级
composer.json中repositories字段优先级高于全局,会覆盖你的DNS优化努力
hosts文件硬映射是最后手段,但要小心同步延迟
当镜像源本身DNS也不稳(比如某些小众镜像未接入优质CDN),可手动绑定镜像域名到IP,跳过所有DNS环节。
- 查IP:
dig +short mirrors.tuna.tsinghua.edu.cn A或nslookup mirrors.tuna.tsinghua.edu.cn 8.8.8.8 - 写入hosts:
137.74.169.73 mirrors.tuna.tsinghua.edu.cn(IP以实际查询为准) - 注意:镜像站IP可能变更,长期使用需定期检查;公司内网DNS策略可能无视hosts
真正卡住的从来不是“要不要换源”,而是换完源之后,Composer还在默默尝试IPv6、拼错URL、被项目配置覆盖、或缓存里存着旧的失败记录——这些细节不处理,再快的镜像也出不来。

















