必须同时配置GitHub OAuth Token和阿里云镜像源:Token将API调用限额从60次/小时提升至5000次,解决403/429限流;镜像源绕过github.com直连的DNS/TLS/丢包问题,二者作用层面不同、缺一不可。

直接配 GitHub OAuth Token + 切阿里云镜像源,两者缺一不可。只做其中一项,90% 的构建失败仍会发生——Token 解决 API 限频(60次/小时 → 5000次/小时),镜像解决直连 github.com 的 DNS/TLS/丢包问题,二者作用层面完全不同。
为什么 composer install 卡在 Loading composer repositories
这不是“慢”,是 GitHub 拒绝响应:未认证请求触发 403 Forbidden 或 429 Too Many Requests,composer -v install 末尾会显示 HTTP/1.1 403 或 rate limit exceeded。现象上卡在 Loading composer repositories with package information,本质是 Composer 正在反复轮询 https://api.github.com/ 获取包元数据(tag、commit、package.json),而匿名请求每小时仅 60 次配额,中等项目一次 install 就超限。
常见误判:
- 认为是网络代理或科学上网没开 → 实际 curl -I https://api.github.com 可能返回 403,说明不是连不上,而是被限流
- 改 composer.json 里的 repositories → 无效,元数据拉取发生在解析阶段,不走项目级配置
- 清缓存、重试、换 PHP 版本 → 都不治本
必须全局配置 github-oauth token
Token 必须用 composer config -g github-oauth.github.com <token> 写入全局配置,不能写进项目 auth.json 或 composer.json。原因很实在:Composer 在解析依赖树前就要查 GitHub API,此时项目目录还没读、auth.json 还没加载,只有全局配置能覆盖整个链路。
- Token 权限至少勾选
repo(不是public_repo),否则私有 fork 或某些元数据操作会静默失败 - 优先创建 fine-grained token,限制 scope 为
Contents: read-only,避免 classic token 被弃用风险 - 生成后立刻复制保存,GitHub 不再提供二次查看明文的入口
- 验证是否生效:
composer config -g github-oauth.github.com应输出 token 前几位;更准的是composer diagnose看GitHub API: OK
必须切换 packagist 镜像源到阿里云
Token 解决 API 限频,但不解决 github.com 直连不稳定的问题。国内访问 github.com 常因 DNS 污染、TLS 握手失败、中间设备重置连接(Connection reset by peer)导致中断。阿里云镜像(https://mirrors.aliyun.com/composer/)把元数据和 ZIP 下载都代理到国内节点,彻底绕过 GitHub 出口。
- 全局设置(推荐):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 单项目设置(适合 CI):
composer config repo.packagist composer https://mirrors.aliyun.com/composer/,会写入项目composer.json的repositories - 注意:
composer.lock里记录的是旧 URL,首次切换后建议删掉composer.lock和vendor/重装 - 别用已停更的
https://packagist.phpcomposer.com,2023 年底起不再同步
CI/CD 中容易漏掉的关键点
GitHub Actions、GitLab CI 等环境里,Token 和镜像配置常被忽略或错放位置:
- 不能只靠提交到仓库的
auth.json→ 它只用于下载 ZIP,不参与 API 元数据查询 - 必须在 job 开头显式运行
composer config -g命令,且确保与composer install是同一用户、同一 shell session - GitHub Actions 推荐用
COMPOSER_AUTH环境变量注入:{"github-oauth": {"github.com": "${{ secrets.GITHUB_TOKEN }}"}},比硬编码更安全 - 镜像源配置也要在 CI 脚本里执行,不能依赖本地预设 —— 默认仍是
packagist.org - 如果用了自建私有镜像(如 Toran Proxy),确认它是否代理 GitHub API,多数只代理 dist ZIP,不代理元数据
最常被忽略的其实是「双重失效」:Token 配了但权限不够(public_repo 无法读 private fork),镜像切了但没清 composer.lock 导致还在走旧 URL。这两处一出问题,错误表现几乎一样 —— 卡住、403、无限等待。调试时先跑 composer diagnose,再看 composer -v install 最后几行 HTTP 状态码,比猜快得多。


















