composer 进度条仅可视化单个 zip 下载的字节进度,不反映依赖解析等阶段;卡在65%常因 chunked 传输缺失 content-length 导致百分比失效,真实耗时需用 --profile 查看毫秒级实测值。

Composer 的进度条不提供真实耗时预估,也不反映整体安装完成时间;它只是对单个 ZIP 文件下载过程的字节级可视化,且常因 HTTP 响应头缺失而失效。
为什么 composer install 进度条显示 65% 却卡住不动
进度条只作用于单个远程 ZIP 包(如 vendor/symfony/console/xxx.zip),依赖解析、autoload 生成、脚本执行等阶段完全不参与该进度计算。你看到的“卡在 65%”往往是因为:
- HTTP 响应使用了
Transfer-Encoding: chunked,导致无法获知总大小,进度条退化为[??????????] 0%或直接消失 - 实际卡点在
Resolving dependencies阶段——这个 SAT 求解过程无 I/O、无输出、无百分比,-v也看不到任何进展 - 某个包下载失败后反复重试(比如私有 Git 仓库超时),但进度条只刷新成功下载的包,失败项静默跳过
--profile 才是看真实耗时的唯一可靠方式
--profile 输出的是 Composer 内部各阶段的毫秒级累计耗时,不是估算,而是实测值。它和进度条无关,也不依赖终端是否支持 ANSI:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
[65.3MiB/1.52s] Resolving dependencies through SAT→ 真实依赖解析耗时 -
[120.6MiB/28.74s] Downloading 45 packages→ 下载阶段总耗时(含重试、等待、连接建立) - 最后一行的耗时值就是本次命令总执行时间,精度到小数点后两位
- 不加
-v时,你无法知道这 28.74 秒里哪几个包拖了后腿;加了才能看到具体 URL 和包名
别信“剩余时间”——Composer 根本不计算也不输出它
所谓“预估完成时间”在 Composer 源码中不存在。它的进度条逻辑只基于:已接收字节数 / Content-Length 响应头。一旦该头缺失(Packagist 大量使用分块传输),就无法算出百分比,更不可能推导剩余时间。试图用 shell 脚本给每行输出加时间戳,也会被进度条里的 \r 和 ANSI 清屏控制符(如 \033[2K)破坏格式,导致终端显示错乱。
真正需要监控耗时或做自动化判断,应该抓 --profile 的末行累计值,或用 time composer install --no-ansi --no-progress 做外部计时——但后者包含进程启动开销,不如 --profile 精确。










