最准判断依据是执行composer config -g repo.packagist,返回空则走默认源,否则返回值即当前生效镜像地址;URL末尾斜杠不可省略,否则部分Composer 2.2+版本会404或静默回退官方源。

composer config -g repo.packagist 命令必须带末尾斜杠
执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 时,URL 后的 / 不是可选的。漏掉它会导致部分 Composer 版本(尤其是 2.2+)请求 https://mirrors.aliyun.com/composer/packages.json 失败,返回 404 或空响应,最终 fallback 到官方源,但你完全察觉不到——composer install 依然慢,且 composer diagnose 可能仍显示 Repo packagist.org is default。
验证是否写对:运行 composer config -g repo.packagist,输出必须是完整 JSON,形如:
{"type":"composer","url":"https://mirrors.aliyun.com/composer/"}注意:url 字段值末尾有且仅有一个 /;type 必须是 "composer",不是 "vcs" 或空字符串。
项目级配置会直接覆盖原有 repositories 字段
进项目根目录后执行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加 -g),这条命令不是“追加”,而是**全量替换** composer.json 中的 repositories 对象。
- 如果项目原本已配置私有 Git 包源(如
"my-private": {"type": "vcs", "url": "https://git.example.com/pkg"}),执行后整个repositories会被清空,只剩阿里云镜像 - 若需保留原有源,应手动编辑
composer.json,将阿里云镜像作为"packagist"子项写入repositories,并确保"packagist.org": false出现在根节点(非repositories内部) - 已有
composer.lock的项目首次用新镜像install,大概率报 hash 不匹配错误;删掉vendor和composer.lock再来更稳妥
全局配置在宝塔/CI 等多用户环境下可能不生效
composer config -g 写的是当前用户的 ~/.composer/config.json(Linux/macOS)或 C:\Users\用户名\AppData\Roaming\Composer\config.json(Windows)。但在宝塔面板、Jenkins 或 systemd 服务中,实际执行 Composer 命令的用户往往是 www、jenkins 或 root,而非你登录 shell 的用户。
排查方法:
- 在宝塔「PHP 管理器」里点「一键部署」前,先用该用户身份执行
composer config -g repo.packagist,看是否输出预期 JSON - CI 脚本中不要依赖全局配置,改用临时参数:
composer install -vvv --repository-url=https://mirrors.aliyun.com/composer/ - 确认执行用户:在脚本开头加
whoami && echo $HOME,再检查对应$HOME/.composer/config.json是否存在且正确
换源后必须用 -vvv 验证真实请求地址
光看 composer install 是否变快不可靠。有些网络环境(如公司代理、内网 DNS 拦截)会让请求静默 fallback 到官方源,而终端没有任何提示。
唯一可信方式是加 -vvv 参数并观察日志:
composer install -vvv 2>&1 | grep "GET https"
你应该看到类似:
GET https://mirrors.aliyun.com/composer/packagist.json
而不是:
GET https://repo.packagist.org/packagist.json
如果没看到阿里云域名,说明镜像根本没走通——这时别急着重装 Composer,先检查:curl -I https://mirrors.aliyun.com/composer/ 是否返回 200;composer diagnose 是否报 SSL 或 DNS 错误;以及是否被本地 hosts 或防火墙拦截。


















