Composer 2.2+ 唯一有效的并发控制方式是设置 http-max-concurrent-downloads,其他参数如 parallel-downloads、--concurrency 已废弃;需先确认版本 ≥2.2,再通过 composer install -vvv 观察多行 Downloading 或进度跳跃验证生效,全局配置命令为 composer config -g http-max-concurrent-downloads 8。

Composer 2.2+ 唯一有效的并发控制方式是设置 http-max-concurrent-downloads,其他参数如 parallel-downloads、--concurrency、COMPOSER_PARALLEL 已废弃,设了也无效。
确认 Composer 版本是否支持该配置
低于 2.2 的版本根本不读 http-max-concurrent-downloads,强行配置等于白写。必须先验证:
- 运行
composer --version,输出应为Composer version 2.2.0或更高;若为2.1.x或1.x,立刻执行composer self-update - 验证生效:运行
composer install -vvv,观察日志中是否同时出现多行Downloading https://;若只有一行在动,说明并发被静默降级(常见于 DNS 卡顿、镜像拦截或未启用 cURL) - 检查 PHP 是否启用 cURL:
php -m | grep curl,没启用会退化为串行且不报错
全局或项目级设置 http-max-concurrent-downloads
这个配置项控制 HTTP 请求池大小,影响 install、update、require 全部命令的下载阶段,但只对 Composer 2.2+ 生效:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 推荐值为
6~8:兼顾速度与稳定性;设10可覆盖多数开发机带宽,但超过12容易触发阿里云/腾讯云镜像的429 Too Many Requests - 全局生效:
composer config -g http-max-concurrent-downloads 8 - 仅当前项目生效(不加
-g):composer config http-max-concurrent-downloads 6 - 查看当前值:
composer config -g http-max-concurrent-downloads,输出应为数字,不是null或空 - 注意拼写:必须是
http-max-concurrent-downloads(少一个单词、多一个连字符、漏掉http-都不生效)
CI/CD 中用环境变量临时覆盖并发数
环境变量优先级最高,会直接覆盖 composer.json 和全局 config,适合流水线动态调整:
- 正确变量名是
COMPOSER_MAX_PARALLEL_HTTP_REQUESTS(不是COMPOSER_PARALLEL,该变量自 2.2 起失效) - 示例:
COMPOSER_MAX_PARALLEL_HTTP_REQUESTS=4 composer install - 某些老旧 CI 环境可能禁用环境变量传递,此时需显式写入
composer.json的config段(不推荐长期使用)
遇到 429 或卡在 Downloading 时的降级组合动作
单设并发数往往不够,尤其在 CI/CD 或高密度构建场景下:
- 必须同步执行三项操作:全局设低并发(
composer config -g repos.packagist.org.concurrent-downloads 2)、启用至少 3 个带"canonical": false的国内镜像、执行composer clear-cache - 注意键名差异:
repos.packagist.org.concurrent-downloads是针对镜像源限流的专用配置,和http-max-concurrent-downloads不同,两者可共存,但用途不同 - 验证镜像 URL 结尾必须含
/,否则路径拼接出错导致404;运行composer config -g repo.packagist查看输出是否为完整 JSON 且含有效地址
容易被忽略的是:并发控制只作用于下载阶段,不影响依赖解析(串行)和 autoloader 生成(单线程),所以即使设了 1,也不会让整个 install 变成“完全串行”,但会显著拖慢下载环节——尤其当镜像返回 429 或超时重试时,一个失败请求会阻塞整条并发队列。

















