验证 composer 镜像配置是否生效的四大方法:1. composer config -g repo.packagist 检查输出是否为含 "type": "composer" 的完整 json;2. composer install -vvv | grep "get\|downloading" 查真实请求 url;3. curl -h "user-agent: composer/..." 模拟请求验证镜像连通性与响应;4. 检查环境变量及项目级 composer.json 中 repositories 是否覆盖全局配置。

运行 composer config -g repo.packagist 看输出是否为完整 JSON
这是最直接、最权威的验证动作,不依赖网络、不触发下载、三秒内出结果。有效输出必须是形如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} 的完整 JSON 对象。
常见无效现象包括:
- 输出为空、
null或提示Key "repo.packagist" does not exist→ 配置根本没写进去 - 只输出字符串,如
"https://mirrors.aliyun.com/composer/"→ 缺"type": "composer"字段,新版 Composer 会静默忽略 - 输出仍是
{"type":"composer","url":"https://packagist.org"}→ 镜像未生效,还在走官方源
失败主因通常是:repo.packagist 写成 repos.packagist(多一个 s)、漏掉 -g、URL 少末尾 /、或 type 值没显式指定为 composer。
用 composer install -vvv 抓真实请求日志
配置“存在”不等于“生效”。唯一能确认流量真发到哪的,是看 Composer 实际发起的 HTTP 请求。
在项目根目录下执行:
composer install -vvv 2>&1 | grep "GET\|Downloading"
重点检查日志中是否出现类似以下内容:
GET https://mirrors.aliyun.com/composer/packages.jsonDownloading https://mirrors.tuna.tsinghua.edu.cn/composer/p2/monolog/monolog.json
如果看到的是 packagist.org、api.packagist.org 或 codeload.github.com,说明镜像未接管——大概率是项目级 composer.json 里有 "repositories" 字段,它无条件屏蔽全局配置。
注意:composer install -vvv 必须在含 composer.json 的目录下运行;若项目已存在 vendor/ 或 composer.lock,建议先 rm -rf vendor composer.lock 并加 --no-cache 重试。
用 curl -v 模拟 Composer 请求头直连镜像端点
浏览器访问不可靠,很多镜像会根据 User-Agent 拒绝非 Composer 请求。必须模拟真实行为:
curl -v -H "User-Agent: Composer/2.9.6" -H "Accept: application/json" https://mirrors.aliyun.com/composer/packages.json 2>&1 | grep -E "(Connected to|HTTP/)"
关键观察点:
- 出现
Connected to mirrors.aliyun.com→ DNS、TLS、路由均通 - 返回
HTTP/2 200或HTTP/1.1 200 OK且Content-Type: application/json→ 镜像服务正常响应 - 卡住、超时、或连到
packagist.org→ 本地网络策略(代理、/etc/hosts、DNS 污染)在干扰
若返回 404,大概率是 URL 少了末尾 /(例如写成 https://mirrors.aliyun.com/composer),导致路径拼接错误。
检查环境变量和项目级配置是否覆盖全局
Composer 查源顺序是:环境变量 > 项目级 composer.json > 全局配置。哪怕 composer config -g repo.packagist 显示正确,也可能被更高优先级设置覆盖。
依次执行以下命令排查:
- Linux/macOS:
env | grep COMPOSER_REPO_PACKAGIST;Windows:echo %COMPOSER_REPO_PACKAGIST%→ 若有输出,该值将强制生效,需先清除 -
composer config repo.packagist(不加-g)→ 查当前项目实际读取的源地址 -
grep -A5 '"repositories"' composer.json→ 看是否硬编码了无效源(如已下线的https://packagist.phpcomposer.com)或空数组
若项目级 "repositories" 存在,即使只配了一个私有包源,也必须显式补上 Packagist 官方镜像条目并设 "packagist.org": false,否则默认源不会自动注入。











