Composer 本身不支持运行时开启 cURL 详细追踪,需通过 HTTP_CLIENT_DEBUG=1 环境变量启用 Guzzle 调试日志,或切换至 ext-curl 适配器手动注入 CURLOPT_VERBOSE,最可靠方式是使用 mitmproxy 等工具捕获原始 HTTPS 流量。

Composer 命令本身不支持运行时开启 cURL 详细追踪
Composer 的网络请求由其底层的 composer/composer 依赖(主要是 php-http/client-common 和实际适配器,如 php-http/guzzle6-adapter 或 ext-curl)处理,它没有内置类似 --verbose --debug --curl-trace 这样的开关。所谓“动态开启 cURL 追踪”,本质是让 Composer 底层使用的 HTTP 客户端输出原始 cURL 日志(比如 CURLOPT_VERBOSE 或 CURLOPT_STDERR 输出),但 Composer CLI 层面并未暴露该能力。
通过环境变量强制启用 Guzzle 的调试日志(最常用有效方案)
多数 Composer 安装默认使用 Guzzle 作为 HTTP 客户端(尤其是 PHP ≥7.2 + cURL 扩展启用时)。Guzzle 支持通过环境变量开启请求/响应体和 cURL 底层调用的完整 dump:
- 在运行 Composer 命令前,设置
HTTP_CLIENT_DEBUG=1(注意:不是COMPOSER_*前缀) - 同时建议加
-vvv提升 Composer 自身日志级别,便于对齐上下文 - 若仍看不到 cURL 句柄级细节(如 DNS 解析、TLS 握手、重定向跳转),需确认实际使用的适配器——可通过
composer diagnose查看 “HTTP client” 行,若显示 “cURL” 而非 “Guzzle”,说明走的是原生 cURL 封装,此时该环境变量无效
示例:
HTTP_CLIENT_DEBUG=1 composer -vvv update laravel/framework
替换为原生 cURL 适配器并手动 patch 调试逻辑(适用于深度排查)
当 HTTP_CLIENT_DEBUG 无输出,或需捕获 TLS 握手失败、DNS 超时等底层问题时,可临时切换到 ext-curl 直接驱动,并注入 CURLOPT_VERBOSE:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
- 先禁用 Guzzle:运行
composer config --global http-basic.github.com ""(清空可能触发 Guzzle 的认证配置),再执行composer config --global http-client ext-curl - 然后在项目根目录创建
curl-debug.php,内容为:
<?php
// 强制所有 cURL 请求开启 verbose 模式
if (function_exists('curl_setopt_array')) {
$original = \Composer\Util\HttpDownloader::class;
// 实际需 patch Composer 的 HttpDownloader::doDownload() 方法
// 但更简单方式:设环境变量 COMPOSER_HTTP_PROXY=127.0.0.1:8000 并用 mitmproxy 抓包
}
?>
⚠️ 真实 patch 需修改 Composer 源码中 HttpDownloader 构造函数,对每个 curl_init() 后追加 curl_setopt($ch, CURLOPT_VERBOSE, true) 和 curl_setopt($ch, CURLOPT_STDERR, fopen('php://stdout', 'w')) —— 不推荐生产环境操作,仅限本地复现网络问题。
替代方案:用外部工具捕获真实 cURL 流量(最可靠)
绕过 Composer 内部机制,直接观察其发出的原始 HTTP 流量:
- 启动
mitmproxy或Charles Proxy,配置系统代理(如export HTTP_PROXY=http://127.0.0.1:8080) - 运行
composer config --global http-proxy http://127.0.0.1:8080 - 执行
composer require foo/bar,所有请求将经代理转发并完整记录 headers/body/timing - 若需抓取 HTTPS(如 packagist.org),需安装 mitmproxy 根证书到系统信任库;否则会因证书校验失败静默中断
此法不依赖 Composer 版本或客户端实现,能 100% 暴露 TLS 错误、302 重定向链、服务端返回的 raw body(比如 403 时的 HTML 页面),是排查镜像源、防火墙拦截、证书过期等问题的最终手段。
真正卡住的地方往往不是“怎么开开关”,而是没意识到 Composer 的 HTTP 客户端有多个实现路径,且 verbose 日志只在特定适配器+环境组合下生效;一旦看到 Failed to open stream: Connection refused 却无更多线索,大概率得切到 mitmproxy 看第一手流量。

















