直接加--verbose暴露真实HTTP请求,可查超时、DNS拦截或空响应;国内用户须确认镜像源生效,-vvv才能看到依赖求解器的完整拒绝链。

composer install卡在“Loading composer repositories”不动?直接看真实HTTP请求
这不是网络慢,是根本没发出去请求——默认模式下 Composer 把所有 HTTP 交互都吞掉了。加 --verbose 才能暴露底层 curl 行为,比如 GET https://packagist.org/packages.json 是否超时、是否被 DNS 拦截、是否返回了 403 或空响应体。
常见错误现象:终端停在 Loading composer repositories 超过 2 分钟,无报错也无进度;或者突然中断,只显示 Could not fetch 但没说哪个 URL、哪个包、哪一行失败。
-
composer install --verbose是最低成本排查方式,它会打印每一步的请求 URL、HTTP 状态码、响应头(如Content-Type: application/json)和 JSON 解析结果 - 如果看到
Failed to decode JSON,说明响应不是合法 JSON——大概率是镜像源挂了、反代配置错、或被防火墙注入了 HTML 错误页 - 国内用户务必先确认镜像源是否生效:
composer config -g repos.packagist应输出{"type": "composer", "url": "https://packagist.org"},若仍是https://packagist.phpcomposer.com这类已停用地址,需手动切换 - 别信
--dry-run --verbose:它跳过实际网络请求,只模拟解析,无法暴露真实连接失败
想 grep “Connection refused”或“SSL certificate problem”?必须重定向 stderr
--verbose 和 -vvv 的所有调试输出都走 stderr,不是 stdout。不重定向,grep 就等于在读空文件。
正确写法示例:
composer install --verbose 2>&1 | grep "Connection refused" composer update -vvv 2>&1 | grep "SSL certificate"
关键点:
-
2>&1必须紧贴命令后,不能写成composer install 2>&1 --verbose(参数顺序错会导致重定向失效) - CI/CD 环境中建议加
--no-ansi,避免 ANSI 颜色码干扰文本匹配:composer install --verbose --no-ansi 2>&1 | grep "Resolving dependencies" - 终端刷屏太快?用
head/tail截断:composer install -vvv 2>&1 | head -n 500查前半段初始化逻辑
为什么 -vvv 才能看到依赖求解器的真实拒绝链?
只加 --verbose 看不到 “because php ^8.1 is required by monolog/monolog” 这类回溯链条。必须用 -vvv,它才会触发 SAT 求解器的完整日志通道,输出 Rejecting monolog/monolog:1.5.0 + 后续多行 because... 原因链。
典型使用场景:
- 执行
composer update -vvv 2>&1 | grep -A5 "Rejecting.*monolog",快速定位哪个版本被拒、依据哪条 rule - 发现反复出现
Skipped monolog/monolog (no matching package)?往上翻几行,大概率看到because it requires php ^8.2—— 说明不是包冲突,而是 PHP 版本不匹配 -
COMPOSER_VERBOSE_SOLVER=1 composer update -vv可聚焦求解器决策,但仅限已确认存在冲突、且-vvv日志太长难定位时使用;它不输出 HTTP 日志,只回答“solver 怎么想的”
Docker 或 CI 中日志乱码/缺失?TERM 和输出流要提前对齐
在容器里跑 composer install -vvv,可能看到一堆乱码、换行错位、甚至日志直接消失——这不是 Composer bug,是终端能力未声明导致的输出截断。
实操建议:
- 运行前先设
export TERM=xterm,尤其在 Alpine 基础镜像或旧版 Ubuntu 容器中,否则 ncurses 类库无法识别控制序列 - 别在 Dockerfile 的 RUN 指令里直接写
composer install -vvv,应拆成两步:RUN export TERM=xterm && composer install -vvv --no-ansi 2>&1 > /tmp/composer-debug.log - GitHub Actions 中,
COMPOSER_NO_INTERACTION=1必须显式设置,否则某些插件会卡在交互式提示上,导致整个 job 挂起 - 本地
~/.composer/log文件完全不用看——它只记初始化失败,不包含任何一次install或update的网络/依赖日志
最常被忽略的一点:-vvv 日志里真正关键的不是开头的 HTTP 请求,而是结尾那几行 “Resolving dependencies through SAT” 后的规则编号和 rejection 回溯。很多人只扫前面就放弃,其实答案藏在最后 100 行里。











