composer中文镜像仅加速元数据和dist包,不加速git clone;解决cloning卡住需单独配置git层,镜像源与git源完全独立,混用或漏配会导致换源后仍慢。

Composer中文镜像本身不加速git clone,只管元数据和dist包;要解决Cloning卡住,必须单独配置Git层——镜像源和Git源是两套完全独立的系统,混用或漏配其中任一,都会导致“换源后依然慢”。
composer config -g repo.packagist 为什么总不生效
这条命令静默失败的根源就三个硬伤:repo.packagist写成repos.packagist(多一个s)、漏掉composer这个type值、URL末尾没加/。任一出错,Composer 2.x+直接fallback到https://packagist.org,不报错也不提示。
-
composer config -g repo.packagist输出必须是完整JSON,形如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空、null、只返回URL字符串,都说明失败 - Windows用户别手动改
C:\Users\用户名\AppData\Roaming\Composer\config.json,权限和JSON格式极易出错,一律用命令写入 - CI/CD或宝塔里以
www用户运行时,-g配的是当前登录用户,得用sudo -u www composer config -g repo.packagist ...针对性配置
项目级配置如何安全追加镜像而不破坏私有源
执行composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不带-g)时,Composer会自动识别现有repositories结构:
- 如果原
"repositories": {}是对象,它会新增"packagist"键,不覆盖已有内容 - 如果原
"repositories": []是数组,它会向末尾追加新项,前提是数组里没有同名"packagist"条目 - 千万别手动写
"packagist": false——这会让php、ext-json等基础约束校验失败 - 改完立刻跑
composer update --lock,确保composer.lock里记录的是镜像地址,不是官方源
Cloning卡住?Git层必须单独调优
看到Cloning into 'xxx'卡住,问题100%在Git,跟Composer镜像无关。关键动作是替换源地址协议+调Git全局参数:
- 把GitHub原始地址(如
https://github.com/laravel/framework.git)换成Gitee镜像地址(如https://gitee.com/mirrors/laravel-framework.git),并确认该镜像已同步且为公开可克隆 - 私有仓库必须用SSH协议(如
git@gitee.com:xxx/yyy.git),并确保ssh-agent已加载密钥,或Token通过GIT_TOKEN注入环境变量 - 执行以下Git配置防超时:
git config --global http.postBuffer 524288000、git config --global http.lowSpeedLimit 0、git config --global http.lowSpeedTime 999999 - 启用高压缩:
git config --global core.compression 9,减少传输体积
验证是否真走镜像:-vvv比猜更可靠
别靠感觉判断,用composer require monolog/monolog -vvv看真实请求日志:
- 重点扫一眼HTTP请求域名:出现
mirrors.aliyun.com才说明元数据走镜像;若还有packagist.org,就是"packagist.org": false没生效或repo.packagist配置失败 - 看到
curl error 28或Connection timed out,说明DNS解析或HTTPS握手失败,得先ping mirrors.aliyun.com和curl -I https://mirrors.aliyun.com/composer/packages.json查底层连通性 - Git克隆阶段的日志里若仍是
github.com,说明repositories里没显式覆盖对应包的vcs源,或者Packagist记录的原始source URL没被重写
最常被忽略的点:镜像站同步有延迟,alpha/beta版本可能根本没同步过去;Git镜像地址必须是裸仓库URL(结尾不能是.git以外的路径),否则git clone会失败。











