虚拟机中composer install卡在resolving dependencies或loading composer repositories,90%是因未配置镜像——需在虚拟机内执行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,同步cache目录、禁用ipv6并启用opcache cli。

本地虚拟机里跑 composer install 卡在 Resolving dependencies 或 Loading composer repositories,90% 不是虚拟机性能差,而是它压根没走宿主机配好的国内镜像——它在用自己的网络环境重走一遍 DNS、TLS、超时逻辑,甚至可能被 IPv6 拖死。
为什么虚拟机不继承宿主机的 Composer 镜像配置
Composer 的镜像配置是用户级的,写在 ~/.composer/config.json 里。虚拟机(如 VirtualBox/Vagrant/WSL2)默认是独立系统,root 或 vagrant 用户的 ~/.composer 是空的,根本没读宿主机的配置。
常见错误现象:
- 宿主机执行
composer config -g repo.packagist输出阿里云地址,但虚拟机里执行同一命令返回空或https://packagist.org -
composer install -vvv日志里全是GET https://repo.packagist.org/...,没一个请求打到mirrors.aliyun.com - 手动在虚拟机里配镜像后变快,说明问题纯属配置缺失,不是虚拟机本身慢
正确映射方式:不要复制文件,要复用配置逻辑
直接拷贝 ~/.composer/config.json 到虚拟机容易出错(路径权限、PHP 版本差异、cache-files-dir 指向宿主机路径导致失败)。更稳的做法是让虚拟机“按需调用”宿主机已生效的镜像逻辑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在虚拟机里执行:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(必须带composertype 和末尾/) - 同步设置缓存目录:
composer config -g cache-files-dir /home/vagrant/.composer/cache/files(避免指向宿主机路径) - 强制禁用 IPv6(尤其 VirtualBox 默认启用了 IPv6 fallback):
export COMPOSER_IPV4=1,加到~/.bashrc里 - 如果虚拟机用户是
vagrant,别用sudo执行 config 命令——否则写进的是root的配置,vagrant用户运行时读不到
宿主机配了镜像,虚拟机还卡在 “Loading composer repositories” 怎么办
这个阶段卡满 30 秒,大概率是 DNS 或 TLS 握手失败,不是镜像地址错了,而是虚拟机网络栈没绕过干扰:
- 检查虚拟机是否启用了 IPv6:运行
ip -6 addr,如有inet6地址且未禁用,加export COMPOSER_IPV4=1后重试 - 确认虚拟机 DNS 设置:Vagrant 默认用
10.0.2.3(VirtualBox),建议改成223.5.5.5(阿里 DNS)或114.114.114.114 - 临时验证是否真走镜像:运行
composer diagnose,看输出里Repo packagist.org:后面是不是你设的阿里云地址;不是就说明repo.packagist没写对(比如写成repos.packagist多了个 s) - 别信
composer config -g输出——它只读配置文件,不校验实际可用性;真正有效的是composer install -vvv 2>&1 | grep mirrors.aliyun.com
CI/CD 或 Vagrantfile 里自动配镜像的可靠写法
手动进虚拟机配一次不解决长期问题。Vagrantfile 或 CI 脚本里应固化以下三步(顺序不能错):
- 先清旧缓存:
composer clear-cache - 再设镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 最后设并发和超时:
composer config -g http-max-concurrent-downloads 10和composer config -g http.timeout 600
注意:Vagrant 的 config.vm.provision 若用 shell 方式执行,得指定 privileged: false,否则命令跑在 root 下,而 vagrant 用户后续运行 composer 时读不到。
最易被忽略的一点:虚拟机里 PHP CLI 的 opcache.enable_cli 很多镜像默认关着,会导致依赖解析反复编译 Composer 自身代码——加一句 php -d opcache.enable_cli=1 $(which composer) install 能省掉几秒到十几秒,尤其在 Laravel 项目里。










