-vvv 是 Composer 唯一即时调试入口,直接输出 HTTP 请求、JSON 响应、依赖规则、脚本参数等全部内部细节,所有输出走 stderr,需重定向才能 grep;本地 ~/.composer/log 不含运行时日志,完整记录须用 2>&1 重定向。

直接加 -vvv 就行,不是“开启日志”,而是把内部调试流打到终端
Composer 没有“日志开关”或配置文件选项来启用详细输出——-vvv 是唯一、即时、无需任何前置设置的调试入口。它不写文件、不改缓存、不依赖 composer.json,命令一跑,所有 HTTP 请求头、JSON 响应体、依赖规则编号、脚本执行参数全刷出来。
-
-v:只显示“正在加载仓库”“正在安装 monolog/monolog”这类进度提示 -
-vv:开始出现包名+版本号+命令路径,比如Executing command (/tmp): php -v -
-vvv:真正进入调试层——你会看到GET https://packagist.org/packages.json、原始HTTP/2 200响应头、json_decode() expects parameter 1 to be string, bool given的真实上下文
别信 --dry-run -vvv 能代替真实执行:它跳过锁文件校验和平台扩展检查(比如 ext-redis 缺失时根本不会报错),看似安全,实则漏掉关键失败点。
查错时必须重定向 stderr,否则 grep 什么都捞不到
Composer 把所有 -vvv 输出都扔进 stderr(标准错误流),而 grep 默认只读 stdout(标准输出)。不重定向,就等于对着空气过滤。
- 正确写法:
composer update -vvv 2>&1 | grep "monolog" - 查是否走镜像源:
composer install -vvv 2>&1 | grep "mirrors.aliyun.com" - 看脚本执行顺序:
composer install -vvv 2>&1 | grep "Executing script"
在 CI 或 Docker 环境里,还建议加 --no-ansi,避免 ANSI 颜色码污染日志解析,比如:composer install -vvv --no-ansi 2>&1 | grep "Writing.*into cache"。
本地日志文件其实没用,真要留档得靠命令重定向
Ubuntu/Debian 下的 ~/.composer/log 文件,只记录极少量初始化错误(如 config 加载失败),**完全不包含 install 或 update 过程中的任何依赖解析、网络请求、脚本执行日志**。它不是运行时日志,更像一个低频故障快照。
- 想保存一次完整调试过程?用重定向:
composer update -vvv --no-ansi 2>&1 > composer-debug.log - 想追加记录多次操作?用双尖括号:
composer install -vvv 2>&1 >> composer-run.log - 实时盯输出?开两个终端:
tail -f composer-debug.log+ 另一个跑命令
别去翻 ~/.composer/config.json 找日志开关——它根本没有这个字段。
遇到 Failed to decode response 之类错误,-vvv 才是真相探测器
这类报错表面是 JSON 解析失败,实际 90% 不是 PHP 问题,而是网络层被截断:公司防火墙拦截 SNI、代理返回空响应、DNS 解析超时后 file_get_contents 返回 false,但 Composer 统一抛成“decode 失败”。
-
-vvv会明确打出:Downloading https://packagist.org/packages.json→ 空行 →Failed to decode response: json_decode() expects parameter 1 to be string, bool given - 这时你就知道该去查
curl -I https://packagist.org/packages.json,而不是改 PHPmemory_limit - 如果看到
SSL certificate problem: unable to get local issuer certificate,说明是证书链问题,不是包源配置错
最常被忽略的一点:某些私有仓库返回非标准 JSON(比如多了一个 trailing comma,或用了单引号),-vvv 会直接把那段非法字符串打出来——你一眼就能复制粘贴去验证,不用猜。










