必须配置GitHub Personal Access Token,否则Composer默认匿名请求受限于每小时60次;需通过composer config -g github-oauth.github.com <token>全局写入,并确保auth.json权限为600且域名严格为github.com。

Composer install 时提示 “API rate limit exceeded” 怎么办
这是 Composer 尝试通过 GitHub API 获取包元数据(比如 composer.json 或 tag 列表)时触发了未认证请求的速率限制(60 次/小时)。根本原因不是你装得太勤,而是 Composer 默认用匿名方式调 GitHub,没带身份凭证。
解决路径很直接:让 Composer 带上你的 GitHub Personal Access Token 发请求。这不是“可选优化”,是必要配置,尤其在 CI 环境或团队共享机器上。
- Token 必须至少有
repo权限(读私有库也需要),public_repo对公开包够用 - 别用密码或 SSH key 替代 —— GitHub 已弃用密码认证,SSH 不用于 Composer 的 HTTP API 调用
- 生成地址:https://www.php.cn/link/9c450eb90c31bc12f1691f235da5a0cc,建议起名
composer-github-token
如何把 Token 告诉 Composer(全局配置)
运行这条命令,Composer 会自动写入 auth.json(通常在 ~/.composer/auth.json):
composer config -g github-oauth.github.com <your_token_here>
注意:github-oauth.github.com 是固定键名,不能写成 github.com 或漏掉 .com;-g 表示全局,避免每个项目重复配。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
- 执行后检查文件内容是否类似:
{"github-oauth": {"github.com": "xxx..."}} - 如果之前已有
auth.json,命令会合并而非覆盖,安全 - 别把 Token 硬编码进项目级
composer.json—— 容易误提交,且不生效(该字段只支持仓库镜像类配置)
CI 环境下怎么安全传 Token(如 GitHub Actions)
不能明文写在 workflow YAML 里。正确做法是用 secrets 注入环境变量,再由 Composer 读取:
composer config -g github-oauth.github.com "${{ secrets.GITHUB_TOKEN }}"
或者更推荐的方式:直接用 auth.json 模板 + 环境变量替换(避免命令行历史泄露 Token):
echo '{"github-oauth": {"github.com": "'$GITHUB_TOKEN'"}}' > ~/.composer/auth.json
-
GITHUB_TOKEN是 GitHub Actions 自动提供的(权限受限但对 public repo 足够),私有库需另配 personal token - 某些 CI(如 GitLab CI)需手动添加 secret 并映射为环境变量,变量名要和命令中引用的一致
- 确认 CI 运行用户有写
~/.composer/权限,否则config -g会失败
验证 Token 是否生效 & 常见失效场景
运行 composer diagnose,看输出里是否有 GitHub API: ok。如果仍报限速,重点排查:
- Token 是否过期或被手动删掉(GitHub 后台可查)
- 是否误配成
gitlab.com或其他域名 —— GitHub 的域必须严格是github.com - 是否用了企业版 GitHub(GHES),此时域名应为
your-company.github.com,且需额外配置composer config -g github-domains your-company.github.com - PHP 进程是否缓存了旧的 auth 配置?改完
auth.json后,composer clear-cache再试
Token 配一次能用很久,但一旦换设备、重装系统或清理 Composer 目录,就得重配 —— 这点容易被忽略,尤其在 Docker 多阶段构建里,auth.json 不会自动继承。

















