Composer首次安装慢主因是默认串行下载+海外源+源码拉取,执行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/、composer config -g parallel-downloads 10、composer config -g prefer-dist true三步并清缓存,可将8分钟降至1.5分钟内。

Composer 首次安装慢,90% 以上不是网速问题,而是默认串行下载 + 海外源 + 源码拉取三重卡顿。开 parallel-downloads、切阿里云镜像、强制 --prefer-dist 这三步做完,实测从 8 分钟降到 1.5 分钟以内。
为什么 composer install 首次这么慢
首次安装(尤其没 composer.lock 或锁文件过期)会触发完整依赖解析 + 全量下载 + 解压 + autoload 生成。但真正拖住你的往往不是 PHP 解析,而是:
- 默认连
packagist.org,DNS 解析常卡在 2–5 秒,TLS 握手失败率高 - 没开并行,
downloading状态是逐个排队,一个包卡住,后面全等 - 默认 fallback 到
--prefer-source(尤其是 dev 分支或私有包没配 dist),要 clone 整个 Git 仓库 - vendor 写入被 Windows Defender 或 macOS 文件系统 fsync 拦截,解压完写几百个文件时明显卡顿
必须执行的三项全局配置
这三步不依赖项目,一次设置,永久生效(Composer 2.2+):
- 换国内镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(别用已停服的 phpcomposer.com) - 启用并行下载:
composer config -g parallel-downloads 10(设 10 是多数机器上限;若报file_put_contents(/tmp/): failed to open stream,降为 6 或 8) - 强制 dist 包:
composer config -g prefer-dist true(跳过 Git clone,只下 ZIP;注意:如果项目里composer.json显式写了"prefer-source": true,得手动删掉)
执行完立刻运行 composer clear-cache,否则旧缓存仍走海外源。
CI/CD 构建中必须加的参数组合
本地开发可以宽松,但 CI 脚本里每秒都算钱,以下参数缺一不可:
-
--no-dev:跳过require-dev(如 phpunit、phpstan),省掉 30–60% 时间 -
--no-autoloader:不生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补 -
--no-scripts:阻止post-install-cmd执行(比如意外触发npm install或清 Redis) -
--prefer-dist:再强调一次——CI 中必须显式带上,避免项目级配置被覆盖
最终命令示例:composer install --no-dev --no-autoloader --no-scripts --prefer-dist --quiet
容易被忽略的底层瓶颈
做了上面所有,还是卡在某个包不动?往下查:
- 检查是否开了 Xdebug:
php -m | grep xdebug,CLI 模式下它会让 Composer 解析慢 3–5 倍,关掉再试 - 确认 PHP CLI 的 OPcache 已启用:
php -d opcache.enable_cli=1 -m | grep opcache,未启用会导致反复编译 Composer 自身代码 - Docker 构建时,
composer config -g必须写在RUN指令里,不能只在本地配了就以为容器里也生效 - 某些内网环境禁 HTTPS 重定向,需临时加
--secure-http=false(仅限可信内网,勿长期开启)
真正卡住的地方,往往不在下载本身,而在 DNS、TLS、PHP 扩展或文件系统层——别只盯着 parallel-downloads 调数字。


















