Composer不支持多线程,所谓“并行”仅指并发HTTP下载,受http-max-concurrent-downloads和--parallel控制,仅作用于install阶段dist包下载,依赖解析、autoload生成等环节始终串行。

Composer 不支持多线程环境,也没有「多线程安装」这回事——所有所谓“并行”都是并发 HTTP 请求,底层依赖 curl_multi 或异步 HTTP 客户端,不是系统级线程。强行套用“多线程”概念,只会误导配置方向、引发错误或破坏依赖一致性。
别再找 --threads 或 -j 参数
这些参数根本不存在于 composer 命令行接口中。运行 composer install --threads=4 或 composer update -j 8 会直接报错:Unrecognized option: --threads。这不是遗漏功能,而是设计如此:PHP 进程本身不 fork 线程,Composer 也不模拟线程调度。
真正生效的并发控制项只有两个
它们只影响 composer install(非 update)阶段的 dist 包下载,并且必须满足前提条件(composer.lock 存在、curl 扩展启用、镜像响应正常):
-
http-max-concurrent-downloads:Composer 2.2+ 唯一被官方文档认可的并发配置项,推荐设为6~8。全局设置命令:composer config -g http-max-concurrent-downloads 8 -
--parallel:命令行开关,等价于--parallel=4,可显式指定数字如--parallel=6。它仅对当前命令生效,不写入配置。
注意:parallel-downloads 是 Composer 2.2 的实验性旧参数,2.5+ 已弃用;repos.packagist.org.concurrent 是部分用户误传的伪配置,实际无效。
为什么开了并发还慢?先看日志停在哪
运行 composer install -v 观察输出节奏:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果看到多行
Downloading https://...几乎同时出现 → 并发已生效 - 如果卡在
Generating autoload files或某个post-install-cmd→ 下载不是瓶颈,调并发毫无意义 - 如果日志卡在
Reading composer.json of vendor/package (1.2.3)或Resolving dependencies→ 这是依赖解析阶段,天然串行,无法加速
常见假慢原因:DNS 卡顿、GitHub API 限流(未配 token)、镜像源返回 302 跳转、本地 /tmp 目录权限冲突(报 file_put_contents(/tmp/): failed to open stream)。
安全并行的前提是干净的环境与确定的行为
并发本身不危险,但叠加错误配置会放大问题:
- 不要混用
hirak/prestissimo和原生并发:Composer 2.5+ 用户必须执行composer global remove hirak/prestissimo,否则会导致composer.lock结构错乱或静默失效 - CI 环境中务必固定并发值(如
http-max-concurrent-downloads=6),避免因机器差异导致构建时快时慢 - 生产部署永远用
composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader,跳过脚本和 autoloader 生成环节——这些步骤始终单线程,且易出错 - 换镜像源比调并发更重要:国内用户不设
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,开 20 个并发也卡在 TLS 握手
最常被忽略的一点:并发只作用于下载,而真正耗时的 autoload 生成、脚本执行、甚至某一个包的 post-install-cmd 挂起,完全不受影响。盯着 “Downloading” 行动,而不是盲目堆参数。

















