不配中文镜像,ci中composer install必卡在downloading阶段;因默认走packagist.org,dns慢、tls不稳定、cdn弱,且镜像未生效时所有包仍回源,而--repository-url参数可100%确保走镜像。

不配中文镜像,composer install 在 CI 里跑单元测试前大概率卡死——不是 phpunit 慢,是依赖根本下不来。
为什么单元测试构建总卡在 Downloading 阶段
CI 流水线(GitHub Actions、GitLab CI)执行 phpunit 前必须装依赖,而默认走 https://packagist.org。该域名 DNS 解析慢、TLS 握手不稳定、CDN 节点少,且受网络策略干扰,导致日志反复出现 GET https://packagist.org/packages.json failed 或 Downloading vendor/symfony/console/ 卡住超 2 分钟。
本质是:单元测试套件依赖的包(如 phpunit、symfony/var-dumper、mockery)数量多、体积小、请求频次高,网络延迟被放大。
-
composer.lock锁的是元数据 URL,不是下载地址;镜像没生效时,所有包仍回源到packagist.org - CI 容器每次都是干净环境,
composer config -g全局配置基本无效 - 别信“我配过镜像了”——90% 的失败源于命令写错三个细节:键名、
type值、URL 末尾斜杠
CI 脚本里必须用 --repository-url 显式指定镜像
全局配置在 CI 中不可靠,唯一能 100% 确保走镜像的方式,是在 composer install 命令中加 --repository-url 参数。
- 正确写法:
composer install --no-dev --optimize-autoloader --repository-url=https://mirrors.tuna.tsinghua.edu.cn/composer/ -
--no-dev跳过require-dev中的测试工具(如phpstan),加快安装;若需静态分析,单独加步骤 -
--repository-url优先级高于全局和项目配置,不污染composer.json,也不依赖用户权限 - 别用已废弃的
--repository(少-url),Composer 2.9.6+ 会直接报错
项目级配置比全局更稳妥,但要注意覆盖风险
进项目根目录后运行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加 -g),它会向 composer.json 的 repositories 数组追加 "packagist" 条目,而非全量替换。
- 优势:配置随代码提交,新人拉完即用;CI 容器每次构建都读取最新设置;避免不同项目或用户互相覆盖
- 如果项目已有私有源(如
"my-vcs": {"type": "vcs", "url": "https://git.example.com/pkg"}),手动编辑composer.json极易格式出错,务必用命令追加 - 别在
composer.json里硬编码多个"packagist"键——JSON 不允许多 key,会导致解析失败
换镜像后仍卡在 Resolving dependencies 怎么办
镜像只加速下载,不解决依赖解析阶段的卡顿。Resolving dependencies 是纯本地计算,常见真实瓶颈如下:
- PHP 内存不足:默认 128M 不够,临时加
COMPOSER_MEMORY_LIMIT=-1再试 - Xdebug 启用中:会让解析慢 5–10 倍,用
php -d xdebug.mode=off $(which composer) install临时禁用 -
platform配置与实际 PHP 版本不匹配(如"php": "7.4"却在 PHP 8.2 上运行),触发降级查找逻辑 -
composer.lock残留已下线包引用,删掉vendor/和composer.lock,再composer install --no-cache - 验证是否真走镜像:
composer show laravel/framework -vvv 2>&1 | grep "Downloading",确认日志出现mirrors.aliyun.com或对应镜像域名
最常被忽略的一点:CI 构建里删 vendor/ 和 composer.lock 不是可选项,是换镜像后的必做动作——旧 lock 文件记录的是官方源哈希,和镜像返回的元数据不兼容。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











