composer装包hang住90%非网络慢,而是底层阻塞;须先区分卡在“downloading”(curl连接/tls/时间偏移问题)还是“resolving dependencies”(依赖约束过宽导致回溯爆炸)等环节,再针对性处理。

Composer 装包 hang 住(卡在某一步不动),90% 不是网络“慢”,而是某个底层环节被阻塞或跳过校验后进入死等状态;直接重试或切镜像往往无效,必须先判断是「卡在下载」还是「卡在解析/生成/执行」。
composer install 卡在 “Downloading…” 后无响应
这是最常见 hang 住现象,终端停在类似 Downloading https://packagist.org/p/provider-2024-01%24xxx.json 这一行,几秒后无声或超时退出。这不是包损坏,而是 curl 层连接卡死:
- 运行
curl -I https://repo.packagist.org/packages.json,若返回curl: (35) SSL connect error,说明 OpenSSL 或系统时间异常(误差 >5 分钟会导致 TLS 握手失败) - 检查证书路径:
php -r "print_r(openssl_get_cert_locations());",确认default_cert_file存在且可读 - 用
date看系统时间,尤其在 macOS、WSL 或休眠后的虚拟机里,时间偏差极常见 -
composer config -g http.connect-timeout 60比调http.timeout更关键——connect 阶段卡住才是真 hang 点
composer require 卡在 “Resolving dependencies” 不动
这表示 Composer 正在暴力回溯尝试版本组合,不是网络问题,而是依赖约束太松或存在隐式冲突:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查
composer.json里有没有写"*"、"dev-main"或过于宽泛的版本号(如^1.0 || ^2.0),这些会让解析器陷入指数级尝试 - 运行
composer why-not vendor/package:^x.x(需 Composer ≥2.2),它会直接列出谁锁死了该包的旧版,比报错末尾的 “Conclusion” 有用得多 - 临时加
--dry-run:composer require vendor/package --dry-run -v,看它是否反复在两个版本间摇摆 - 如果项目用了私有包或 path 仓库,确认其
composer.json中没有conflict字段误拦了主流依赖
post-install-cmd 脚本没执行却也不报错
脚本看似“hang 住”,实则是根本没触发——Composer 找不到注册入口,或执行时环境已崩:
- 确认
composer.json的scripts是顶层字段,且键名严格为"post-install-cmd"(不是postinstall-cmd或postInstallCmd) - 值必须是字符串并加双引号:
"php scripts/init.php"✅,php scripts/init.php❌(JSON 解析失败后整段被丢弃) - 删掉
vendor/和composer.lock后重试,否则 Composer 可能跳过钩子(尤其之前成功安装过) - 必须用
composer install -vvv(三级详细模式),才能看到真实 stderr 输出;只用-v或-vv会吞掉Fatal error或Class not found
autoload 生成阶段卡住或耗时异常长
运行 composer install --profile 会暴露真实瓶颈:若 [890ms] Generating autoload files 这行耗时突然飙升(比如到 5s+),说明新包引入了大量 PSR-4 映射或扫描逻辑:
- 检查新包自己的
composer.json是否声明了宽泛映射,例如"App\": "src/"但实际src/下有数百个子目录 - 某些旧包会在 autoload 阶段执行反射扫描或 YAML 解析(如 Doctrine 补丁、Laravel 早期扩展),这类操作在 CLI + xdebug 下会被严重放大
- 用
strace -e trace=openat,stat,read php -r "require 'vendor/autoload.php';"(Linux/macOS)看它到底打开了哪些文件——常会发现它在递归遍历config/或resources/ - 临时禁用 xdebug:
php -d zend_extension= -d xdebug.mode=off -r "require 'vendor/autoload.php';",排除调试器干扰
真正卡住的地方,往往藏在你没检查的细节里:系统时间偏移、JSON 键名拼错、PSR-4 路径末尾多了一个斜杠、甚至 vendor/ 目录被 root 占据后 chmod 失效——这些都不是“配置问题”,而是 Composer 在特定条件下选择沉默等待或跳过校验。










