Composer install 卡在 GitHub API 限速是因为匿名请求被限为60次/小时,需配置带repo权限的GitHub Personal Access Token(Classic)到全局auth.json,命令为composer config -g github-oauth.github.com <token>。

为什么 composer install 突然卡在 GitHub API 限速?
因为 GitHub 对未认证的 API 请求做了严格限速(60 次/小时),而 Composer 默认走匿名请求拉取私有库、GitHub Packages 或某些带 Git 子模块的依赖。一旦触发限速,你会看到类似 Failed to download vendor/package: Could not fetch https://api.github.com/repos/xxx/yyy, enter your GitHub credentials 的提示,或者直接卡住不动。
这不是网络问题,也不是 Composer 坏了——是 GitHub 在“礼貌地拒绝你”。解决核心就一条:让 Composer 持有你的 GitHub 令牌(GITHUB_TOKEN),走认证通道,把限额提到 5000 次/小时。
怎么生成并配置 GitHub 令牌给 Composer?
令牌必须带 repo 权限(读私有库必需),其他权限按需加;不能用 gh auth login 生成的短期 token,得手动创建 Personal Access Token(Classic)。
- 访问
https://github.com/settings/tokens/new - 勾选
repo(必选),如果要用 GitHub Packages,再加read:packages和delete:packages - 生成后立刻复制——页面关闭后无法再次查看明文
- 执行命令写入全局配置:
composer config -g github-oauth.github.com <your_token_here>
注意:不要把 token 写进项目级 composer.json,更别提交到 Git。全局配置足够,且 Composer 会自动加密存储在 ~/.composer/auth.json 里。
遇到 401 Unauthorized 或 token is invalid 怎么排查?
常见不是 token 错了,而是权限或配置位置不对。Composer 不会主动告诉你 token 过期,只会静默失败。
- 检查 token 是否已过期(Classic Token 可设有效期,超过就失效)
- 确认是否用了 SSO:如果 GitHub 账户启用了企业 SSO,需在 token 页面点 “Enable SSO” 并授权对应组织
- 运行
composer config -g --list | grep github,确保输出的是github-oauth.github.com,而不是拼错成github.com或api.github.com - 若项目用了
repositories自定义源(比如指向 GitHub Packages),要额外配http-basic认证,不能只靠github-oauth
CI/CD 环境下怎么安全传入 token?
本地配一次就行,但 CI(如 GitHub Actions、GitLab CI)每次都是干净环境,不能硬编码 token,也不能依赖全局 config。
- GitHub Actions 中,用
${{ secrets.GITHUB_TOKEN }}(自带,权限有限)或自定义 secret(推荐) - 在 job 步骤中注入:
composer config github-oauth.github.com ${{ secrets.MY_COMPOSER_TOKEN }} - GitLab CI 同理,通过
CI_JOB_TOKEN或 project secret 注入,再用composer config设置 - 绝对避免在命令行里直接写
composer config ... abc123,token 会被记录进 shell history 或 CI 日志
真正容易被忽略的是:GitHub Packages 的域名是 https://npm.pkg.github.com 或 https://maven.pkg.github.com,但 Composer 访问的是 github.com 的 API,所以配的还是 github.com 这个 host,不是 package registry 的地址。










