最关键的是开头的Reading composer.json和Loading composer repositories、中间卡住时的Downloading行、最后报错前的Failed to download或Could not resolve这三类行,它们直接暴露真实请求地址、解析阶段和失败节点。

composer install -vvv 输出里哪几行最关键
别扫全屏日志,盯住三类行:开头的 Reading composer.json 和 Loading composer repositories,中间卡住时的 Downloading 行,以及最后报错前的 Failed to download 或 Could not resolve。这些行直接暴露真实请求地址、解析阶段和失败节点。
常见陷阱是只看 composer config 输出,但它不反映实际行为。比如 composer install -vvv 2>&1 | grep "Downloading.*packages.json" 打出的第一行 URL,才是 Composer 真正去连的地址——它可能还是 packagist.org,说明镜像没生效。
-
Reading composer.json后立刻跟Loading composer repositories with package information,说明没被项目级repositories字段屏蔽 - 如果
Downloading行出现https://packagist.org/...,哪怕你配了阿里云镜像,也一定是缓存没清或配置写错了 - 报错里带
file_put_contents(): Only variables should be passed by reference这种 PHP 语法错误,其实是镜像返回了 HTML 页面(比如人机验证),不是代码问题
stderr 和 stdout 都得抓,但重点在 stderr
Composer 报错主要走 stderr,比如连接超时、SSL 验证失败、权限拒绝;而 stdout 多是进度条、包名列表、成功提示。但某些警告(如 Warning: Failed to parse JSON)会混在 stdout 里,所以重定向时不能只捕获一边。
写 wrapper 脚本时用 composer install 2>&1 最省事,但若需分离处理,建议:composer install 2>error.log 1>output.log,再分别检查。
-
stderr里出现cURL error 7→ 系统级连接失败,查 DNS 或代理 -
stderr里出现Permission denied→ 看报错路径,ls -ld检查 vendor/ 或 ~/.composer 归属 -
stdout里出现Resolving dependencies through SAT卡住超过 2 分钟 → 很可能是依赖冲突,不是网络问题
日志里看到 “Killed” 不是 Composer 错,是系统杀了它
终端只显示 Killed,没有堆栈、没有错误码,基本就是 Linux OOM Killer 干的。Composer 进程吃内存太多,内核直接干掉,连 PHP 层都来不及响应。
立刻执行 sudo dmesg -T | tail -20,如果看到 Out of memory: Kill process xxx (php) 就确认了。这时候调 Composer 参数没用,得动系统资源。
- 运行
free -h看可用内存,Docker 容器里低于 512MB 就危险 -
php -i | grep memory_limit查 CLI 模式限制,别设成-1(Composer 内部校验会失败) - 临时加内存限制:
php -d memory_limit=2G /usr/bin/composer install
日志里一堆 ^[[32m 是什么鬼
那是 ANSI 控制符,说明 Composer 在非 TTY 环境下仍尝试渲染彩色进度条或交互提示。常见于 CI 脚本、nohup 后台任务、或某些 WSL 终端组合,不是网络慢,是输出解析崩了。
解决方法很简单:加 --no-ansi 强制禁用颜色和控制符,--no-interaction 关闭所有交互等待。
-
composer install --no-ansi --no-interaction -vvv是 CI 环境的标准写法 - 如果还卡在
Loading composer repositories,大概率是 DNS 或 TLS 握手问题,不是 ANSI 导致的 - Windows 上某些终端(如旧版 PowerShell)不兼容 ANSI,换 Windows Terminal 或加
--no-ansi
memory_limit 设成了 -1。关键不是读错在哪一行,而是看错为什么出现在那一行。


















