华为云镜像提速需三步:配对(正确配置repo.packagist及命令)、并发(启用parallel-downloads=8)、跳过冗余(避免项目级repositories覆盖、禁用autoload/scripts);否则90%问题仍卡顿。

换华为云镜像本身不能提速,但能绕过 packagist.org 的海外链路瓶颈;真正卡住的90%不是网络差,而是 repo.packagist 拼错、被项目级 repositories 覆盖、没开 parallel-downloads,或缓存残留旧元数据。
确认华为云镜像地址和全局配置命令是否正确
华为云镜像地址不是 https://mirrors.huaweicloud.com/composer/(旧文档常见错误),也不是 https://repo.huaweicloud.com/repository/php/,而是:
https://mirrors.huaweicloud.com/repository/php/composer/(注意路径含 /repository/php/composer/,结尾必须有斜杠)
全局配置只有一条命令,大小写、空格、参数顺序都不能错:
composer config -g repo.packagist composer https://mirrors.huaweicloud.com/repository/php/composer/
- 键名是
repo.packagist,不是repos.packagist(多一个s就静默失效) - 第二个参数
composer是 type 声明,漏掉会 fallback 到官方源 - URL 必须以
https://开头,且末尾带/,否则部分 Composer 版本拼接失败 - 验证是否写入成功:
composer config -g repo.packagist,输出应为含"type": "composer"的 JSON 对象
检查是否被项目级 repositories 覆盖
Composer 源优先级是:项目级 > 全局 > 默认源。只要当前目录下 composer.json 里有 repositories 字段,全局配置就自动失效。
常见陷阱包括:
-
"repositories": {}(空对象)也会屏蔽全局镜像 -
"repositories": [](数组格式)会导致composer config repo.packagist命令报错 - 写了
"packagist.org": false但没显式定义新packagistkey,结果所有包都拉不到
安全写法是手动编辑 composer.json,确保 repositories 是对象,且包含固定 key packagist:
{
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.huaweicloud.com/repository/php/composer/"
}
}
}
这个 packagist 是硬编码 key 名,不能改成 huawei 或其他名字。
必须启用 parallel-downloads 并设合理并发数
parallel-downloads 是 Composer 2.2+ 内置的并发机制,默认仅开 3 个线程——相当于把高速下载压成单车道。不开它,换再快的镜像也跑不满带宽。
执行这条命令启用高并发:
composer config -g parallel-downloads 8
- 推荐值是
8;设为10容易触发临时文件竞争,报file_put_contents(/tmp/): failed to open stream - 该设置只对
composer install生效;composer update仍需串行解析依赖图,本质无法完全并发 - CI 构建时建议加
--no-autoloader和--no-scripts,跳过非必要步骤
清理缓存并验证实际请求路径
旧缓存可能残留已失效的元数据,让 Composer 继续尝试旧路径,导致“看似生效实则无效”。
- 强制清空:
composer clear-cache,看到Cache directory deleted才算成功 - 验证是否走新镜像:
composer install -v,观察日志中是否出现https://mirrors.huaweicloud.com/... - 检查 DNS 缓存是否刷新:
curl -I https://mirrors.huaweicloud.com/repository/php/composer/,应返回200 OK - 公司代理或防火墙可能拦截
mirrors.huaweicloud.com,需单独测试连通性
最易被忽略的是:全局配置写在 ~/.composer/config.json,但宝塔、CI 或 systemd 服务往往以不同用户(如 www、runner)运行,它们读的是各自家目录下的配置——配了等于没配。











