sat求解器在暴力回溯冲突导致卡在resolving dependencies,需用composer why-not定位阻断链、检查require-dev autoload隐式循环,而非盲目调timeout。

不是网络慢,是 SAT 求解器在暴力回溯冲突——调 timeout 没用,得先定位卡点再精准干预。
卡在 Resolving dependencies 是约束冲突,不是超时
终端停在 Resolving dependencies 或 Resolving dependencies through SAT,CPU 拉满、内存暴涨、无日志输出,这是 Composer 的依赖求解器(SAT solver)在尝试满足所有 require/conflict 约束时陷入不可解状态。它根本没发起 HTTP 请求,所以切镜像、加 http.timeout、改 process-timeout 全无效。
- 运行
composer update -vvv --profile,看最后一行是否反复出现同一包名或路径闭环(如a → b → c → a) - 若输出含
cycle和包名闭环链,就是循环依赖;若只有Conclusion: don't install X,则是版本约束冲突 - 别删
vendor/或清缓存——这只会掩盖真实约束关系,让问题更难复现
用 why-not 定位阻断链,比等解析快十倍
你想装某个包却失败?直接问 Composer 谁在挡路,比盲猜高效得多:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer why-not vendor/package:version(例如composer why-not guzzlehttp/guzzle:^8.0) - 输出会逐层列出所有阻断项:可能是
laravel/framework的require,也可能是你根composer.json里的conflict - 若报
Package not found,说明该包未进composer.lock,先删composer.lock再跑composer update --dry-run -v看第一步失败点
require-dev 和 autoload 是隐式循环高发区
80% 的“循环”不写在 require 里,而是靠自动加载悄悄打通的。比如 phpunit/phpunit 的 autoload 声明了 "../src/",就把你的 src/ 加进了它的加载路径;而你的代码又继承了它的 TestCase,运行时就形成隐式闭环。
- 临时注释掉
composer.json中所有非核心的require-dev条目(如phpunit/phpunit、infection/infection) - 再跑
composer update --dry-run -v,如果不再反复跳转,问题就在这里 - 逐个恢复
require-dev包,配合composer show package-name查它的autoload配置,特别留意含../、../../、src/的路径
process-timeout 和 http.timeout 完全不同作用域
这两个参数常被混用,但它们管的是完全不同的阶段:
-
http.timeout控制单次 HTTP 请求(DNS、TLS、首字节、body 传输),默认仅 60 秒;下载大包或镜像首字节延迟高时最先触发,建议设为300~600 -
process-timeout控制整个命令总耗时(含解压、脚本执行、autoloader 生成),默认 300 秒;大项目跑 post-install-cmd 时容易超,推荐设为1200 -
http-basic.timeout是 v1 废弃项,v2 完全不读取,设了也没用
真正卡在 Downloading https://... 才调 http.timeout;卡在 Executing command (CWD: )(如 git clone)才调 process-timeout。盲目拉长两者,只是把失败从 5 分钟拖到 20 分钟。










