卡在resolving dependencies是dns解析失败所致,非网络下载慢;需用dig/nslookup验证域名解析是否超时,换可靠dns(如8.8.8.8)、禁用ipv6、清缓存并确认镜像配置生效。

为什么Composer卡在Resolving dependencies而不是Downloading
这是典型的DNS层卡顿,不是包下载慢。Composer在解析packagist.org或镜像域名时,会先查DNS,再发HTTP请求;如果DNS响应超时(比如IPv6 fallback、内网DNS未命中、宿主机systemd-resolved干扰),它就停在Resolving dependencies不动,且不报错——你等几分钟后看到的“超时”其实是DNS层累积延迟。
- 用
dig packagist.org或nslookup packagist.org验证是否真能快速返回IP,若超时或返回unknown host,说明DNS失败 - 公司/学校网络常屏蔽
packagist.org的DNS查询(不止HTTPS),换8.8.8.8或114.114.114.114立竿见影 - IPv6 fallback最隐蔽:
curl -v https://packagist.org 2>&1 | grep "Connected to"若显示2a03:2880:类地址且后续卡住,就是它——Composer默认先试IPv6,单次超时1–3秒,上百个包叠加就是几分钟无响应 - Docker容器内更易中招:默认继承宿主机
/etc/resolv.conf,而systemd-resolved常把127.0.0.53写进去,实际是代理,不稳定
如何强制禁用IPv6并指定可靠DNS
Composer本身不提供禁用IPv6开关,但可通过系统级手段切断fallback路径,让DNS查询直走IPv4并命中最快节点。
- Linux/macOS下临时生效:
echo 'options inet6' | sudo tee -a /etc/resolv.conf(加inet6选项会禁用IPv6 DNS查询) - Docker运行时指定DNS:
docker run --dns 8.8.8.8 --dns 114.114.114.114 your-image composer install - Docker Compose服务级配置(推荐):
services: app: dns: - 8.8.8.8 - 114.114.114.114 dns_search: - svc.cluster.local该配置直接写入容器/etc/resolv.conf,绕过宿主机干扰 - CI/CD中避免依赖宿主机DNS:在GitHub Actions或GitLab CI脚本开头加
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
镜像源URL和DNS调度必须协同才有效
只配https://mirrors.tuna.tsinghua.edu.cn/composer/不够——如果DNS没做GSLB(智能解析),全国用户可能全被解析到同一个北京机房IP,反而比就近节点还慢。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 验证是否真有地域调度:
dig mirrors.tuna.tsinghua.edu.cn在北京、广州、上海分别执行,看返回IP是否不同 - 清华源、阿里云源都支持GSLB,但URL末尾
/不能少:https://mirrors.tuna.tsinghua.edu.cn/composer/(少斜杠会404) - 别信“自动选最快”:Composer不测速、不切换、不感知地理位置,所谓“就近”完全依赖DNS解析结果
- 如需脚本化测速,用
curl -o /dev/null -s -w "%{http_code} %{time_total}s" --no-keepalive --dns-servers 8.8.8.8 https://mirrors.tuna.tsinghua.edu.cn/composer/packages.json,取200且time_total 的源
容易被忽略的缓存与覆盖陷阱
DNS优化白做了,往往是因为旧缓存或项目级配置悄悄覆盖了你的全局设置。
- 改完DNS或镜像源后,必须清缓存:
composer clear-cache,否则仍可能从本地缓存读取已失效的packages.json地址 - 检查项目根目录
composer.json是否硬写了repositories字段——它的优先级高于composer config -g,会直接忽略你设的全局镜像 - 验证是否真生效:
composer config -g repo.packagist.org(看全局)和composer config repo.packagist.org(不加-g,看当前项目),两者输出应一致 - PHP的
default_socket_timeout也得同步调大(如设为600),否则cURL底层在DNS+TLS阶段就超时,Composer的http.timeout压根没机会起作用
真正卡住的从来不是Composer本身,而是你没意识到DNS查询发生在HTTP之前、且没有被任何日志显式标记。每次Resolving dependencies停顿,都该先问:这个域名,此刻在我这台机器上,到底能不能被dig秒出答案。










