换DNS比换镜像源更关键,因为Composer卡在Downloading或Resolving dependencies的第一秒往往是DNS查询失败或超时,国内运营商DNS常劫持、污染、响应慢,导致mirrors.aliyun.com等域名解析耗时2–5秒,100个包累计等待达3分钟;必须优先设为114.114.114.114或223.5.5.5等可靠DNS,并验证curl首行响应<300ms。

为什么换DNS比换镜像源还关键
Composer 卡在 Downloading 或 Resolving dependencies 的第一秒,往往不是没连上镜像,而是 DNS 查询失败或超时。国内运营商 DNS 常劫持、缓存污染、响应慢,github.com、mirrors.aliyun.com 这类域名查一次就可能耗 2–5 秒——100 个包就是 3 分钟白等。
这不是 Composer 的锅,是系统级网络栈行为。哪怕你用了阿里云镜像、开了 parallel-downloads,只要 DNS 慢,所有后续操作都得排队等解析结果。
- 优先改系统 DNS:设为
114.114.114.114或223.5.5.5(阿里 DNS),比改 hosts 更稳定、覆盖更全 - 验证是否生效:
time curl -I https://mirrors.aliyun.com/composer/,首行响应时间应< 300ms - 别信“本地 hosts 就够了”:只加
github.com的 IP,漏掉codeload.github.com或api.github.com,Composer 仍会 fallback 到慢 DNS 查 - Docker 容器内必须单独配 DNS:在
/etc/docker/daemon.json里加"dns": ["114.114.114.114"],否则默认用宿主机 DNS,但容器网络栈常绕过 host 的 hosts 配置
Composer 自身不缓存 DNS,但能绕过它
Composer 没有内置 DNS 缓存机制,也不读系统 nscd 或 systemd-resolved。它依赖 PHP 的 curl 或 stream_socket_client 底层调用,而这些调用直通操作系统 resolver。
所以所谓“预缓存”,其实是人为制造 DNS 结果复用:要么提前解析好并写入 hosts,要么让 Composer 绕过域名直接走 IP + SNI。
- 临时调试可用:
COMPOSER_DISABLE_TLS=true composer install(不推荐长期用)——跳过 TLS 握手,但依然要 DNS 解析;真正省掉 DNS 的只有硬编码 IP - 安全且可行的做法:在
composer.json中把镜像源写成 IP 形式(需确认 HTTPS 证书匹配):"https://[114.67.12.34]/composer/",但阿里云镜像不支持 IP 直连(SNI 不匹配证书),所以这条路实际走不通 - 真正起效的是
github-protocols配置:composer config -g github-protocols https,避免 SSH 协议 fallback 触发额外 DNS 查询(如git@github.com→ 查github.comA 记录 → 再查 SSH 端口) - 别碰
disable-tls true:它关的是证书校验,不是 DNS,反而因握手失败重试,拉长整体耗时
hosts 文件该写哪些域名才真正有效
只写 github.com 是最常见误区。Composer 下载包时实际访问的域名远不止一个,漏任何一个都会触发 DNS 查询,打断“预缓存”效果。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
以下域名必须全部加入 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows):
-
mirrors.aliyun.com(主镜像源) -
github.com(部分包仍走 GitHub release) -
codeload.github.com(GitHub ZIP 下载入口) -
api.github.com(元数据查询,尤其含dev-master时) -
packagist.org(即使换了镜像,Composer 3 默认仍会尝试校验官方源签名,需拦截)
获取对应 IP 的方式:dig +short mirrors.aliyun.com | head -n1,注意取 A 记录,别拿 AAAA(IPv6)。IP 需定期更新,建议每月 dig 一遍,或用脚本自动刷新。
缓存目录和 DNS 共同失效时的排查顺序
当 composer install 明明用了镜像、清了缓存、也改了 DNS,却仍卡在开头几秒,大概率是 DNS 和缓存路径双重问题叠加。
按这个顺序快速定位:
- 运行
composer install -v,看第一条输出是Reading ./composer.lock还是卡在Downloading https://mirrors.aliyun.com/...—— 前者说明 DNS 已通,问题在缓存或包本身;后者说明 DNS 仍阻塞 - 检查
composer config -g cache-files-dir输出是否为空或指向 NFS/加密卷;SSD 路径应类似/tmp/composer-cache/files - 确认
cache-vcs-dir是否独立配置:只设cache-dir不等于cache-vcs-dir也被改,Git 克隆仍走慢盘 - 执行
strace -e trace=connect,openat composer install --dry-run 2>&1 | head -20(Linux),看是否在反复 connect 到不同 IP,暴露 DNS fallback 行为
真正快的 Composer 不靠“多线程”或“黑科技”,而是 DNS 稳、镜像近、缓存实、命令准——四者缺一不可。其中 DNS 是最先触达、最容易被忽略的一环。

















