-vvv 卡在 downloading https://… 通常因 dns 解析失败、tls 握手超时或 gzip 响应损坏,需结合 stderr 分析;日志重定向应使用 > log 2>&1 或 tee,避免丢失关键错误。

composer install/update 为什么卡住?先看 -vvv 输出
卡在 Downloading https://... 不代表网络慢,大概率是 DNS 解析失败、TLS 握手超时或响应 gzip 损坏——这些只有 -vvv 才会暴露底层 curl 行为。普通 -v 或 --verbose 只告诉你“正在装哪个包”,根本看不到请求头、状态码和原始响应体。
-
composer install -vvv会打印完整 HTTP 请求头/体、json 响应原始内容、临时解压路径,甚至 SAT 求解器每一步回溯过程 - 若日志中出现
Failed to decode response: zlib_decode(): data Error,说明服务端返回了损坏的 gzip 包,可加--no-plugins排除插件干扰后重试 - windows PowerShell 默认截断长行,建议改用
cmd,或加2>&1 | more分页查看
怎么保存完整日志供后续分析?
Composer 本身不支持内置日志文件,但 shell 重定向足够可靠。关键不是“存下来”,而是确保 stderr(错误流)不丢失——很多关键报错(如 401、ssl handshake failed)只走 stderr。
- 最稳妥写法:
composer install -vvv > composer.log 2>&1 - 想边看边存?用:
composer install -vvv 2>&1 | tee composer.log - 别用
> composer.log单独重定向,否则 stderr 仍打屏,你可能错过真正报错
为什么 -vvv 日志里没看到依赖冲突原因?
因为 -vvv 虽然输出海量决策痕迹,但冲突定位靠人眼 grep 太低效。它告诉你“排除 monolog/monolog[1.25.0]:与 php ^8.0 冲突”,但不会自动指出是哪个包强制要求了旧版 monolog。
- 优先用:
composer prohibits monolog/monolog:^2.0,它直接列出所有阻断该版本的依赖及其约束条件 -
composer show --tree是静态快照,不反映求解过程;它不会告诉你 laravel/octane 怎么间接把 doctrine/dbal 锁死在 3.6.0 - 如果
-vvv输出里反复出现backtrack或selecting,说明求解器在暴力尝试,此时更应检查config.platform是否写了不存在的扩展(如"ext-foobar": "1.0"),这会让 Composer 在解析前就直接退出
哪些配置会悄悄禁用 -vvv 日志?
不是所有 -vvv 都有效。有些配置项优先级更高,会强制压制详细输出,让你白加参数。
-
config.verbose设为false会彻底屏蔽所有 verbose 输出,命令行加多少个v都无效 - 全局
auth.json中域名拼错(比如写成gitlab.example.com但实际是gitlab.example.org),-vvv会显示401 Unauthorized,但你可能误以为是 Token 权限问题 - 私有 GitLab 仓库必须在
composer.json的repositories里显式声明 https 地址,否则 Composer 根本不会尝试访问,-vvv日志里连Downloading都不会出现
依赖解析那部分日志动辄上万行,真要逐行读,不如先用 composer prohibits 锁定冲突源头;而真正需要 -vvv 的时候,往往不是为了“看懂”,而是为了确认 cURL 到底卡在哪一层——DNS?TCP?TLS?还是服务端返回了非法 gzip?这点容易被忽略。