composer install卡在downloading本质是未连国内镜像,仍在直连packagist.org;主因是默认单线程串行下载,tls握手与i/o等待占耗时70%以上,需切镜像、清缓存、设parallel-downloads=15并验证-vvv日志。

composer install卡在downloading,本质是没连上国内镜像
不是网络差,是还在直连packagist.org。Composer 默认不走任何镜像,所谓“慢”,其实是每个包都排队等 TLS 握手 + 单连接下载,I/O 等待占耗时 70% 以上。
验证方式很简单:composer config -g repo.packagist 输出必须是完整 URL,且以 / 结尾,例如 https://mirrors.aliyun.com/composer/。少一个 / 就会拼出 .../composerpackages.json 导致 404;多写一个 s(如 repos.packagist)配置直接被忽略。
- 执行
composer clear-cache—— 旧缓存里存着海外元数据,不清理,换源等于白换 - 公司内网可能复用 cURL DNS 缓存,导致
mirrors.aliyun.com仍解析成海外 IP;临时加export COMPOSER_NO_INTERACTION=1可绕过部分拦截 - 项目级
composer.json里写了"repositories",会覆盖全局配置;用composer config --list和composer config --list --global对比确认实际生效项
阿里云镜像不是唯一选项,但它是目前最稳的
腾讯云、华为云镜像同步延迟几小时,刚发布的 dev-main 或新 tag 很可能拉不到;中科大源偶尔不稳定;而阿里云镜像每 5 分钟同步一次,且对 --prefer-dist 支持最完整——它只缓存 dist 包,几乎不存 source。
如果用了 --prefer-dist 但镜像没切成功,Composer 会 fallback 到 Git clone,速度直接回到龟速甚至失败。
- 设全局镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否真走镜像:跑一次
composer install -vvv,最后几行出现Reading packages.json from cache at .../https---mirrors-aliyun-com-composer/...才算生效 - 某些 CI 环境禁用了 HTTPS 重定向,可临时加
--secure-http=false(仅调试用,勿提交)
parallel-downloads 不是默认开的,得手动调到 10–15
composer install 默认串行下载,parallel-downloads 是唯一能开并发的开关,但默认值是 3,基本等于没开。它只对 install 生效,update 因依赖图重算仍部分串行。
- 查当前值:
composer config -g parallel-downloads,输出应为10或15(别超20) - 设全局并发:
composer config -g parallel-downloads 15 - 如果报
file_put_contents(/tmp/): failed to open stream,说明并发太高触发临时文件竞争,降到8或6再试
CI 构建中不加这组参数,vendor 目录装完也跑不起来
开发机要 autoload 和脚本,CI 场景下它们全是 I/O 开销。不关掉,vendor 装完也起不来——因为根本没生成 autoload.php。
-
--no-autoloader:跳过生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补 -
--no-scripts:阻止执行post-install-cmd,避免意外触发npm install或数据库迁移 -
--no-dev:跳过require-dev里的全部包(PHPUnit、PHPStan 占体积和时间大头) -
--prefer-dist:强制走压缩包而非 Git,尤其对只有dev-main分支的包是关键
这些参数组合在 CI 中必须成套使用,漏一个就可能让构建时间翻倍,或因 autoload 缺失导致后续步骤直接失败。











