ci/cd中composer安装慢主因是镜像未配对、缓存路径错误、参数未锁死;须执行composer config -g repo.packagist确认输出为https://mirrors.aliyun.com/composer/,加-vvv验证日志含镜像域名,项目级配置更可靠,缓存~/.composer/cache而非vendor,ci必用--no-dev --prefer-dist --optimize-autoloader --classmap-authoritative组合。

CI/CD 里 Composer 安装慢,90% 是镜像没配对、缓存路径写错、安装参数没锁死——三者缺一,提速就失效。
确认镜像源是否真生效
执行 composer config -g repo.packagist,输出必须是类似 https://mirrors.aliyun.com/composer/ 的 URL。如果为空、null、或仍是 https://packagist.org,说明配置根本没落到实际运行命令的用户环境里。
- CI 脚本里用
sudo composer config -g,很可能写进了root的~/.composer/config.json,但构建容器里跑的是runner用户,读不到 - 拼错字段名(比如写成
repos.packagist多了个s)会静默失败,composer config -g repo.packagist查出来还是空 - 验证是否真走镜像:加
-vvv运行composer install,日志里出现GET https://mirrors.aliyun.com/composer/p2/才算成功
项目级配置比全局配置更可靠
在项目根目录运行:composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/。它会自动往 composer.json 的 repositories 字段安全追加,不覆盖已有私有源。
- 适合 CI 场景:配置随代码提交,所有人行为一致,避免不同镜像混用导致
hash不一致 - 如果
composer.json里已有"repositories": [](数组格式),命令会报错;得先手动改成"repositories": {}(对象)再执行 - 别手写
"packagist.org": false——这会彻底关掉官方源,镜像临时不可用时,composer install直接失败 - 换源后首次
install若报 hash 校验失败,删掉vendor/和composer.lock重来即可
缓存 ~/.composer/cache,别缓存 vendor/
vendor/ 缓存看似快,实则危险:不同 PHP 版本、扩展或 OS 下生成的 autoloader 不能混用,缓存错版本会导致 Class not found 或 Cannot declare class。真正该缓存的是 ~/.composer/cache——它只跟 composer.lock 哈希绑定,与环境无关。
- GitHub Actions 示例:
path: ~/.composer/cache,key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - GitLab CI 示例:
cache: key: ${PHP_VERSION}-composer-cache; paths: - ~/.composer/cache - 缓存失效最常见原因:本地生成了新
composer.lock但没提交,导致key不匹配
CI 中必须组合使用关键安装参数
仅换镜像和缓存不够,CI 场景下必须固定安装行为:--no-dev --prefer-dist --optimize-autoloader --classmap-authoritative 是最稳组合。
-
--prefer-dist:强制下载 ZIP 包,跳过 Git clone(尤其对只有dev-main分支的包至关重要) -
--no-dev:跳过require-dev里的全部包(PHPUnit、PHPStan 等占体积和时间大头) -
--optimize-autoloader和--classmap-authoritative:跳过动态类查找,提升运行时性能,也减少 install 阶段 autoload 生成耗时 - 千万别漏
composer clear-cache——旧缓存可能残留国外源的元数据,不清理,Composer 仍会尝试从旧地址拉取校验信息
最容易被忽略的点是:镜像只加速「元数据拉取」和「zip 包下载」,不解决 Resolving dependencies 卡顿、autoload 生成慢、或 PHP 内存不足的问题。如果换源+缓存+参数都对了,还卡在这个阶段,就得查 COMPOSER_MEMORY_LIMIT、xdebug.mode 或 platform 配置了。











