换镜像后仍连不上packagist.org是因composer未发请求,卡在本地缓存、配置未生效或项目级repositories屏蔽全局设置;需手动编辑config.json确保格式正确、utf-8无bom,并在ci/docker中按实际用户配置或写入composer.json,阿里云内网应使用http://mirrors.cloud.aliyuncs.com/composer/。

为什么“换镜像”后还是连不上 packagist.org
不是镜像挂了,而是 Composer 根本没发请求过去——它卡在本地环节:缓存残留、配置未落盘、或项目级 repositories 字段强行屏蔽了全局设置。常见现象是执行 composer install 时仍显示 Loading composer repositories from https://packagist.org,哪怕你刚敲完 composer config -g repo.packagist。
手动编辑 config.json 是最稳的 fallback 方式
命令行容易拼错键名或漏参数,而直接改文件能一眼确认三件事是否到位:
-
"repositories"是顶层数组(不是对象),且首位必须是{"packagist.org": false} - 第二项为
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},注意末尾斜杠不能少 - 别用记事本或带格式编辑器保存,确保 UTF-8 无 BOM,无中文引号、无尾逗号
改完运行 composer clear-cache,再验证路径:composer config --global --list 第一行就是真实生效的配置文件位置。
CI/CD 和 Docker 中必须按用户写配置
全局配置 -g 只对当前 shell 用户生效,在 GitHub Actions、GitLab CI 或 Docker 容器里,PHP 进程常以 runner、www 或 root 身份运行,你的个人配置根本读不到。解决方案是:
- 在 CI 脚本开头加
sudo -u www composer config --global repo.packagist composer https://mirrors.aliyun.com/composer/(按实际用户调整) - 或更稳妥:进项目目录后执行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/,把镜像写进composer.json,这样所有环境都认 - 若用 Docker,把配置命令写进
Dockerfile的RUN指令中,确保与后续composer install同一用户上下文
阿里云内网用户别用 HTTPS 公网地址
如果你在阿里云 ECS VPC 内运行 CI 或部署服务,公网 HTTPS 镜像会绕远路、耗流量、还可能被限速。内网直连地址是:http://mirrors.cloud.aliyuncs.com/composer/。
这个地址只在阿里云内网有效,用法一样:composer config -g repo.packagist composer http://mirrors.cloud.aliyuncs.com/composer/。注意这里用的是 http://,结尾斜杠同样不可省;Composer 2.9+ 不再拦截该地址,因它由阿里云内网 DNS 解析,不走公网 TLS 握手。











