应先用curl -o /dev/null -s -w "%{http_code} %{time_namelookup}s %{time_starttransfer}s" --connect-timeout 5 https://mirrors.aliyun.com/composer/验证dns解析(≤0.05s)和首字节延迟(≤1.0s),再结合composer install -vvv日志与strace抓包交叉印证,因composer diag不读/etc/hosts且用php内置dns而非curl解析器。

用curl直接测镜像源域名解析与首字节延迟
改完/etc/resolv.conf和/etc/hosts后,别急着跑composer install——先验证DNS是否真快了。关键看两点:域名能否秒解析、HTTPS首字节是否在1秒内返回。
执行这条命令(替换为你配的镜像地址):curl -o /dev/null -s -w "%{http_code} %{time_namelookup}s %{time_starttransfer}s" --connect-timeout 5 https://mirrors.aliyun.com/composer/
-
time_namelookup应 ≤ 0.05s,超0.2s说明DNS没生效或被劫持 -
time_starttransfer(首字节时间)应 ≤ 1.0s;若>2s,即使DNS快也白搭,可能是TLS握手卡住 - 返回
000不是HTTP错误,而是连接失败,要检查nameserver是否写错、hosts里IP是否过期
对比composer install -vvv日志里的实际请求域名
加-vvv参数运行一次最小安装,看真实走的是哪个域名:COMPOSER_HOME=/tmp/test-composer composer install --no-dev --prefer-dist -vvv 2>&1 | grep "Downloading\|Resolving"
重点关注三处输出:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 是否出现
Downloading https://mirrors.aliyun.com/composer/packages.json(而非packagist.org) - 每行
Downloading前的GET请求是否都指向镜像域名,而不是GitHub或GitLab(说明repositories没覆盖全局) - 如果仍有
github.com请求,检查是否漏配/etc/hosts——curl -I https://github.com确认它是否也走预置IP
抓包确认DNS查询是否真的被绕过
Linux/macOS下用strace看composer进程有没有发DNS请求:strace -e trace=connect,sendto,recvfrom -f -s 200 composer install --no-dev 2>&1 | grep -E "(114.114|223.5.5|223.6.6)"
预期结果:
- 看不到
connect(.*8.8.8.8)或sendto(.*1.1.1.1)——说明/etc/resolv.conf生效,没走默认DNS - 大量
connect(.*223.6.6.6)出现——证明/etc/hosts把域名硬绑定到了IP,跳过了全部DNS环节 - 若仍看到
getaddrinfo调用,说明某些PHP扩展(如cURL)绕过了系统DNS配置,得换php.ini里的curl.cainfo或升级cURL
为什么composer diag不能验证DNS优化效果
composer diag只检查本地配置和基础网络连通性,它不会触发真实包下载,也不会读/etc/hosts或/etc/resolv.conf——它用的是PHP内置的DNS解析逻辑,而Composer下载时用的是cURL的DNS解析器。
典型误判场景:
-
composer diag显示“OK”,但composer install卡在Loading composer repositories - 原因:cURL默认启用
CURLOPT_DNS_USE_GLOBAL_CACHE,而PHP CLI进程不共享宿主机DNS缓存;/etc/hosts必须显式写入IP才能生效 - 验证方式:不用
diag,改用php -r "var_dump(gethostbyname('mirrors.aliyun.com'));",输出应是你/etc/hosts里写的IP,否则hosts没加载
curl响应时间、-vvv日志域名、strace系统调用这三层交叉印证上。少一层,就可能漏掉DNS被中间件劫持、cURL忽略hosts、或镜像源本身CDN节点异常的问题。










