答案是SAT求解器暴力回溯版本组合所致,非网络问题;表现为CPU拉高、内存缓涨、无HTTP请求,需用composer update --dry-run -vvv定位回溯路径,并通过精简约束、删dev依赖、调大memory_limit等收敛求解空间。

卡在 Resolving dependencies 是 SAT 求解器死循环,不是网络问题
这一行出现后 CPU 持续拉高、内存缓慢上涨,说明 Composer 还没发任何 HTTP 请求,纯属本地暴力回溯版本组合。此时 http.timeout、process-timeout、换镜像、清缓存全无效。
常见诱因:"^1.0 || ^2.0" 这类宽泛约束、"dev-main" 引入私有包、多个包 require 冲突大版本(如 symfony/console^5 和 ^6 并存)、composer.json 中 require-dev 包过多或 autoload 扫描范围过宽(比如整个 tests/ 目录)。
- 先运行
composer update --dry-run -vvv,盯最后几行是否反复出现Trying: vendor/package或嵌套路径 - 临时加
--no-dev跳过开发依赖,快速验证是否由phpstan/phpstan等工具拖慢 - 检查
vendor/composer/autoload_classmap.php是否超过 2MB;过大说明 autoload 配置太宽 - 内存不足时求解器会静默退出,用
php -d memory_limit=-1 composer update -vvv强制不限制内存
卡在 Downloading https://… 才是镜像或 HTTP 层问题
看到这行且后续无输出,说明请求已发出但没等到响应。此时只有 http.timeout 和镜像地址本身起作用。
关键不是“设了没”,而是“真通没”:手动验证比看 composer config -g repo.packagist 更可靠。
- 运行
curl -I https://mirrors.aliyun.com/composer/packages.json,必须返回200 OK;若卡在Resolving host,是 DNS 问题;卡在TLS handshake,可能是 OpenSSL 版本太老或企业代理证书未导入 - 阿里云当前稳定地址是
https://mirrors.aliyun.com/composer/(结尾必须带/),别拼成/packages.json - 临时调试优先用环境变量:
COMPOSER_HTTP_TIMEOUT=600 composer install,避免污染全局配置 - PHP 自身也有 socket 超时限制,运行
php -i | grep default_socket_timeout,CLI 模式下若为 60,可绕过:php -d default_socket_timeout=600 $(which composer) install
卡在 Executing command 是子进程挂住,process-timeout 才生效
日志停在类似 Executing command (CWD: /path): git clone 或报 [RuntimeException] The process timed out,说明包已下载完成,正在执行脚本、解压或 git clone 私有仓库。
这个阶段只有 process-timeout 或 COMPOSER_PROCESS_TIMEOUT 生效,http.timeout 完全不参与。
- 设为 1200 秒:
composer config -g process-timeout 1200或临时加环境变量COMPOSER_PROCESS_TIMEOUT=1200 - 私有 Git 仓库若用 SSH 地址(
git@xxx),需确认ssh-agent已启动且 key 已添加,否则git clone会卡在密码提示 - 加
--no-plugins快速验证是否插件拖累(如phpstan在安装时加载大量类) - WSL2 下若启用元数据支持,
git clone可能因 symlink 解析卡住,可尝试关闭元数据支持
-vvv 是唯一能暴露真实卡点的开关
-v 和 -vv 只告诉你“正在下载”,但不会暴露 cURL 请求头里 Host 是否写错、SAT 求解器在哪一层回溯失败、或 zlib_decode(): data error 这类 gzip 流损坏。
执行 composer install -vvv 没输出?先查这三处:
-
config.verbose被设为false:运行composer config --list | grep verbose确认,它优先级高于命令行参数 -
config.platform里写了不存在的扩展,例如"ext-foobar": "1.0":Composer 在-vvv下会立刻报错退出,根本进不了依赖解析阶段 - Xdebug 干扰:加
COMPOSER_DISABLE_XDEBUG=1再试;否则堆栈被截断,你看到的Exception trace是假的
中文日志里真正要盯的是开头几行(Reading ./composer.json 失败 → JSON 错误或权限不足)、中间卡住行(Downloading https://mirrors.aliyun.com/composer/packages.json → DNS 污染或镜像地址拼错)、以及末尾反复出现的 because vendor/a requires b:^2.0 —— 冲突根源就藏在这条线往上 5–10 行。


















