Composer install卡在“Loading composer repositories”是因为无法连接packagist.org,DNS污染、TLS阻断及无国内CDN导致元数据拉取失败;必须配置含HTTPS且末尾带/的镜像源,并严格满足repo.packagist键名、显式composer type值、URL结尾斜杠三条件,否则静默回退官方源。

composer install 为什么卡在 “Loading composer repositories”
这不是网络慢,是根本连不上 packagist.org ——DNS 污染、TLS 握手阻断、无国内 CDN,导致元数据(packages.json)拉取失败。你看到的“卡住”,其实是 Composer 在反复重试 HTTPS 请求,直到超时(常达 5 分钟以上),且不报错。
关键点在于:composer install 第一步不是下载包,而是加载全量元数据;这步失败,后续全部停摆。镜像源必须同时提供可访问的 packages.json 和对应 dist 包分发路径,二者 URL 前缀必须严格一致。
-
https://mirrors.aliyun.com/composer/✅(元数据 + ZIP 包均可用) -
https://mirrors.aliyun.com/composer❌(少末尾/,拼出/composerpackages.json→ 404) -
http://开头的镜像 ❌(Composer 2.x 默认禁用非 HTTPS 源,静默 fallback)
composer config -g repo.packagist 命令为何总不生效
这条命令静默失败率极高,根本原因是它必须同时满足三个硬性条件,缺一即被忽略,Composer 自动回退到 packagist.org。
- 必须带
-g参数:漏了就只改当前项目目录下的composer.json,换目录或 CI 环境完全失效 - 键名必须是
repo.packagist(单数repo,不是repos或repositories) - 必须显式写出
composer作为 type 值:写成composer config -g repo.packagist https://mirrors.tuna.tsinghua.edu.cn/composer/就等于没配 - URL 必须是 HTTPS 且以
/结尾:如https://mirrors.cloud.tencent.com/composer/
验证是否真写入成功,只看这一行输出:composer config -g repo.packagist。结果必须是完整 JSON 对象,例如:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。返回 null、空值、或仍是 https://packagist.org,说明配置失败。
如何确认镜像真的在起作用
别信命令执行成功,要看 Composer 实际请求的域名。最直接的方式是加详细日志:
- 运行
composer install -vvv,滚动到底部,找类似这行:Reading packages.json from cache at /home/user/.composer/cache/repo/https---mirrors-aliyun-com-composer/packages.json - 如果日志里还出现
https://packagist.org/packages.json或https://packagist.org/p/,说明 fallback 了,镜像没生效 - 更快速验证:
composer show -v | head -n 5,观察日志中真实的Downloading https://地址
注意:即使全局配置正确,项目级 composer.json 中若已定义 "repositories" 字段,会优先使用项目配置——此时全局镜像被覆盖,需检查并调整项目配置。
项目级配置比全局更可靠的实际场景
全局配置写在 ~/.composer/config.json,但在宝塔、Docker、GitHub Actions 等环境中极易失效:
- 宝塔以
www用户运行,读不到你本地root的配置 - Docker 容器内通常没有全局配置,或用户权限隔离
- CI 流水线常用非交互式用户(如
runner),~/.composer目录可能为空或不可写
推荐做法:进项目根目录,执行(不加 -g):composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/。该命令会向 composer.json 顶层写入 "repositories": {"packagist": {...}},可提交 Git,团队拉代码后自动生效。
但要注意:改完必须删掉 vendor/ 和 composer.lock,再运行 composer install(不是 update),否则旧 lock 文件里的 hash 可能和镜像元数据不匹配,引发校验失败或包缺失。


















