卡在resolving dependencies是sat求解器暴力回溯版本冲突所致,非网络问题;必须用composer why-not定位阻断链,输出首行即真凶,换镜像、清缓存均无效。

卡在 Resolving dependencies 不是网络问题,是 SAT 求解器在暴力回溯版本冲突,必须用 composer why-not 定位阻断链,而不是换源或清缓存。
为什么 composer update 会卡死在 Resolving dependencies
这一步 Composer 根本没发 HTTP 请求,它在本地用布尔可满足性(SAT)算法穷举所有包版本组合,试图同时满足 require、conflict、PHP 版本约束、平台扩展要求等。一旦约束不可解(比如两个依赖分别要求 guzzlehttp/guzzle 的 ^7.0 和 ^8.0),就会陷入指数级回溯——CPU 拉满、日志反复输出 Trying: vendor/package:v1.x,但无实际进展。
常见诱因包括:
-
composer.json里写了过严的php版本约束(如"php": "^8.1"),但当前环境是 PHP 8.0 - 某个间接依赖(如
laravel/framework)锁死了monolog/monolog的 v2 分支,而你想装 v3 -
composer.lock里残留了已下线或不再兼容的包引用 - 启用了
xdebug(php -v可确认),会让解析慢 5–10 倍
怎么快速定位谁在阻断升级
别猜,直接用 composer why-not —— 它会从你指定的目标包出发,逐层向上列出所有阻止其安装的约束源头。
例如你想装 Laravel 11,但卡住了,就运行:
composer why-not laravel/framework:11.0
输出类似:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
your-project - it requires laravel/framework (11.0) laravel/framework 11.0 requires php (^8.2) your-project requires php (^8.1)
关键点:
- 输出里出现
your-project,说明根composer.json本身就有冲突 - 如果某行显示
some/package要求another/package:^2.0,而你想装^3.0,那就是递归链上的死结 - 配合
composer depends --tree monolog/monolog可查清谁在层层 require 它
镜像配置和缓存清理对 Resolving 阶段完全无效
这个阶段不走网络,所以:
- 换阿里云镜像、腾讯云镜像、删
~/.composer/cache、改http.timeout全部不起作用 -
composer clear-cache只影响后续 Downloading 阶段,对当前卡住的 SAT 求解无任何帮助 - 执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/后,若仍卡在 Resolving,说明配置没错,但冲突确实存在
唯一有效的提速动作是临时降低求解复杂度:
- 删掉
composer.lock,加--dry-run --verbose运行composer update,观察哪一层开始反复回退 - 显式锁定中间包版本,比如把
"monolog/monolog": "2.12.0"写进composer.json,收窄搜索空间 - 调试时加
--ignore-platform-reqs排除 PHP 版本或扩展缺失导致的误判(上线前务必去掉)
容易被忽略的底层性能影响点
即使约束可解,Resolving 阶段也可能异常缓慢,因为:
- PHP
memory_limit过低(如 128M),触发 GC 频繁回收,可用COMPOSER_MEMORY_LIMIT=-1临时绕过 - 旧版 Composer(1.x)或未更新的
composer.lock格式,在新版中解析开销更大 -
classmap-authoritative模式虽不影响 Resolving,但若你在update后紧接着跑dump-autoload,整个流程会被拖长——建议拆成两步:composer update --no-autoloader+composer dump-autoload --optimize
真正卡住时,先看 composer update -vvv --profile 日志里停在哪一行;只要看到 Resolving dependencies through SAT,就别碰网络配置,转头去查约束逻辑。










