需配置 github token 以避免 composer 因 api 限流(60次/小时)导致安装卡顿或报错。composer 在查询私有库、vcs 仓库或未打包分支时调用 github api,匿名请求易超限。应生成含 public_repo 权限的 token,并通过 composer config -g github-oauth.github.com 全局配置。

不配 GitHub Token,Composer 安装或更新包时大概率会卡在 Cloning into '...'... 或直接报 API rate limit exceeded 错误——这不是网络问题,是 GitHub 的匿名 API 调用限额(60次/小时)被耗尽了。
为什么 Composer 会触发 GitHub API 限流
Composer 在安装含 "type": "package" 的私有仓库、使用 vcs 仓库类型、或依赖未打包进 Packagist 的 GitHub 分支/Tag 时,会调用 GitHub API 查询 commit、tag、branch 列表。匿名请求走的是 IP 级限流,同一出口(如公司 NAT、CI 服务器、Docker 构建环境)极易撞线。
- 常见触发场景:
composer require username/repo:dev-main、composer update涉及 GitHub 私有库、用repositories手动注册了github.com地址 - 错误典型表现:
Failed to download username/repo: Could not authenticate against github.com或GitHub API limit has been exceeded - 注意:即使你本地 Git 配了 SSH key,Composer 默认仍走 HTTPS + API,不复用 SSH 认证
配置 GitHub Token 的两种可靠方式
Token 必须有 repo 权限(私有库)或至少 public_repo(公开库),生成后需通过 Composer 全局或项目级配置生效。
- 生成 Token:访问
https://github.com/settings/tokens/new,勾选public_repo(够用)或repo(含私有),生成后**立即复制保存**(页面关闭后无法再查看) - 全局配置(推荐,一次设置,全项目生效):
composer config -g github-oauth.github.com <your_token_here></your_token_here> - 项目级配置(适合 CI 或多 Token 管理):
composer config github-oauth.github.com <your_token_here></your_token_here>(不加-g,写入当前项目composer.json的config字段) - 验证是否生效:
composer config -g --list | grep github-oauth应输出 token 哈希前缀(Composer 不明文显示完整 token)
CI/CD 环境下 Token 的安全写法
在 GitHub Actions、GitLab CI 等环境,绝不能把 Token 硬编码进 composer.json 或脚本。必须通过环境变量注入,并确保 Composer 能读取。
- GitHub Actions 示例:
COMPOSER_AUTH='{ "github-oauth": { "github.com": "${{ secrets.GITHUB_TOKEN }}" } }',配合composer install自动识别 - 通用环境变量法(兼容大多数 CI):
export COMPOSER_AUTH='{"github-oauth":{"github.com":"xxx..."}}',注意 JSON 格式要合法、无换行、双引号转义 - Docker 构建中避坑:不要在
RUN composer config ...中写 token(会留在镜像层),改用构建参数或--build-arg注入COMPOSER_AUTH - 敏感提示:GitHub 的
GITHUB_TOKEN(Actions 自动生成)默认权限不足,需在 workflow 中显式声明permissions: contents: read,否则仍报限流
Token 配完不是一劳永逸——GitHub Token 可以设置过期时间,且一旦泄露需立即删除重置;另外,某些老旧 Composer 版本(COMPOSER_AUTH 环境变量支持不完整,建议升级到 Composer 2.x。最常被忽略的其实是权限范围和 CI 的最小权限配置,而不是 token 本身怎么填。










