应先用dig指定dns服务器比对query time(如dig packagist.org @8.8.8.8),确认是否从200–500ms降至20–60ms;再用curl -v或curl -4 -v看连接阶段是否卡在ipv6 fallback;hosts修改后需strace验证或删resolv.conf测试,且php 7.4+需重启进程刷新dns_cache_ttl。

用 dig 和 curl 验证 DNS 解析是否变快
改完 DNS 后别信“应该好了”,得看实际解析耗时。最直接的方法是对比改前改后 dig packagist.org @8.8.8.8 和 dig packagist.org @223.5.5.5 的 QUERY TIME 字段——理想情况应从 200–500ms 降到 20–60ms。
注意:必须指定 @ 后的 DNS 服务器,否则默认走系统配置,测不准;dig 不加 +short 才能看到完整耗时;若返回 ;; connection timed out,说明该 DNS 根本不通,不是慢,是废。
curl -v 看连接阶段卡在哪
curl -v https://packagist.org 2>&1 | grep "Connected to" 能暴露真实瓶颈。如果看到 Connected to packagist.org (2a03:2880:...) 且后续卡住 2 秒以上,基本就是 IPv6 fallback 拖累——Composer 默认先试 IPv6,超时才切 IPv4,上百个包叠加就是几分钟无响应。
验证是否真被 IPv6 卡住:
- 加
-4强制 IPv4:curl -4 -v https://packagist.org,若秒开,就坐实问题 - 临时禁用系统 IPv6(Linux):
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 - 更稳妥的长期方案:在
/etc/resolv.conf里把nameserver放在 IPv4 DNS 前,避免 DNS 返回 AAAA 记录
composer diag 不反映 DNS 实际表现
composer diag 只检查本地配置和基础连通性,它会成功,但不代表 composer install 不卡。真正要测 DNS 对 Composer 的影响,得模拟真实请求链路:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
COMPOSER_HOME=/tmp/composer-test composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/清掉旧缓存干扰 - 跑
time COMPOSER_HOME=/tmp/composer-test composer diagnose 2>/dev/null,重复 3 次看波动——若耗时 >3s,DNS 或镜像源本身有问题 - 关键动作:
time COMPOSER_HOME=/tmp/composer-test composer clear-cache,这个命令会触发大量 DNS 查询,是比diagnose更严苛的压力测试
如果 clear-cache 卡在 “Loading composer repositories” 阶段,90% 是 DNS 解析失败或超时,不是 Composer bug。
hosts 预绑定后如何确认生效
改了 /etc/hosts 后,不能只看 ping packagist.org 返回 IP 就算数。因为 Composer 内部用的是 PHP 的 stream_context_create + cURL,它绕过系统 getaddrinfo 缓存,可能仍走 DNS。
验证方式只有两个:
- 用
strace -e trace=connect,openat php -r "file_get_contents('https://packagist.org/');",看系统调用里有没有对 DNS socket 的 connect 尝试 - 更简单:临时删掉
/etc/resolv.conf,只留nameserver 127.0.0.1,再跑composer clear-cache—— 若仍能完成,说明 hosts 生效;若报Could not resolve host,说明 PHP/cURL 没读 hosts
PHP 7.4+ 默认启用 dns_cache_ttl,改 hosts 后需重启 PHP-FPM 或 CLI 进程才能刷新缓存,这点极易忽略。










