卡在“Resolving dependencies”是DNS解析失败所致,非HTTP超时或代理问题;须用dig验证DNS、修改resolv.conf或hosts、禁用systemd-resolved、核对镜像配置并调高PHP default_socket_timeout。

Resolving dependencies卡住就是DNS问题
这一步根本没发HTTP请求,只查域名IP,http.timeout和代理全无效。常见现象是命令停在Resolving dependencies不动,composer install -vvv最后一行就是它。
- 用
dig mirrors.aliyun.com @114.114.114.114验证DNS是否通——若超时或无ANSWER SECTION,说明本地DNS不可用或被污染 - 临时改DNS:Linux/macOS写
/etc/resolv.conf加nameserver 8.8.8.8;Windows在网卡手动设 - 检查
/etc/hosts(或C:\Windows\System32\drivers\etc\hosts)有没有把mirrors.aliyun.com或packagist.org指向127.0.0.1或错误IP - 企业网/校园网常屏蔽境外域名,用手机热点直连测试——能通就坐实是网络策略问题
虚拟机/Docker里DNS延迟必须硬编码
VirtualBox、Parallels、Docker默认继承宿主机DNS,但NAT层转发会让DNS解析慢到1秒以上,Resolving dependencies卡住是常态。
- 虚拟机内:直接改
/etc/resolv.conf为nameserver 114.114.114.114和nameserver 223.5.5.5 - Docker:修改
/etc/docker/daemon.json,加"dns": ["8.8.8.8", "1.1.1.1"],然后sudo systemctl restart docker - 更激进但有效:在
/etc/hosts里预填关键域名IP,比如120.52.112.16 mirrors.aliyun.com(IP需实时查,别抄旧值) - 禁用
systemd-resolved(Ubuntu/CentOS常见):sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved
换源不能跳过DNS,但能减少解析次数
镜像源配置错,Composer会静默 fallback 到packagist.org,等于白换——而后者域名在国内解析失败率远高于mirrors.aliyun.com。
- 严格核对键名:
repo.packagist(不是repos.packagist),type必须是"composer",URL末尾必须带/:https://mirrors.aliyun.com/composer/✅ - 验证是否生效:
composer config -g repo.packagist输出应为完整JSON,不是null或空行 - 换源后立刻清缓存:
composer clear-cache,否则仍走旧地址 - 阿里云镜像域名
mirrors.aliyun.com比packagist.org在国内解析成功率高得多,本质是把DNS压力从“境外不可控”转到“境内可控节点”
PHP CLI的default_socket_timeout会掐断DNS
即使DNS本身很快,PHP底层socket连接也可能提前中断——因为default_socket_timeout默认常是60秒,低于你设的http.timeout,结果HTTP请求根本发不出去。
- 查当前值:
php -i | grep default_socket_timeout - 若输出值≤60,必须同步调高:编辑
php.ini(CLI用的那份),改default_socket_timeout = 600 - 改完重启终端或重载环境,否则
php -i仍显示旧值 - 这个值影响所有PHP网络操作,不只是Composer,但它是DNS解析能走完的底层保障
DNS优化不是“配个镜像就完事”,它横跨系统、容器、PHP、Composer四层。最容易被忽略的是default_socket_timeout和/etc/hosts预置——前者让DNS查询不被PHP掐断,后者让关键域名彻底绕过DNS链路。











