应直接配置 github personal access token,因其可将 api 限额从每小时 60 次提升至 5000 次,彻底解决 composer 因限流导致的卡顿、403 错误及假性下载慢问题。

不是网络连不上,是 GitHub API 每小时只放行 60 次未认证请求——超了就卡住或报 403,调高 timeout 或换镜像源完全无效。
为什么 composer install 卡在 Downloading https://api.github.com/
这是典型的 GitHub API 限流表现,不是下载慢、DNS 不通或代理没配好。Composer 在解析 dev- 分支、读取 tag 列表、校验 commit 哈希时,会密集发起 HTTPS 请求到 https://api.github.com/。匿名请求被 GitHub 硬性限制为每小时最多 60 次,CI 构建、多人共用出口 IP、频繁 composer update 都极易触达上限。
常见现象包括:
- 日志停在
Downloading https://api.github.com/repos/vlucas/phpdotenv/zipball/v5.6.0几分钟不动 - 报错含
403 Forbidden或API rate limit exceeded,但不明确提示“限流” - 加
-v参数后能看到Using GitHub token from configuration缺失
必须配 GitHub Personal Access Token(且权限和写法都对)
Token 是唯一治本方案,能将限额从 60 次/小时提升至 5000 次/小时。但以下三点任一出错,Token 就等于没配:
- 生成 Token 时只勾选
public_repo(私有库需完整repo),不要勾delete_repo或admin:org - 执行命令必须带
--global:运行composer config -g github-oauth.github.com <your_token_here></your_token_here>(注意域名是github.com,不是api.github.com) - 确认
~/.composer/auth.json权限为600:运行chmod 600 ~/.composer/auth.json,否则 Composer 会静默忽略该文件
验证是否生效:composer diagnose 输出中应出现 GitHub API: OK;或直接运行 curl -H "Authorization: token <your_token_here>" https://api.github.com/rate_limit</your_token_here>,检查返回里 rate.limit 是否为 5000。
composer.json 里硬编码的 repositories 会绕过全局 Token
如果项目 composer.json 中显式写了 "repositories" 字段(比如 Laravel Mix、某些 Symfony bundle 常见),Composer 会优先使用它,导致全局配置的 Token 不生效。
解决方法:
- 检查
composer.json是否包含类似"url": "https://github.com/xxx/yyy.git"的 VCS 源,尤其是 type 为vcs的条目 - 删除冗余的
repositories块,改用 Packagist 官方索引(或阿里镜像)托管的包 - 若必须保留私有仓库,请确保其 URL 使用 HTTPS 格式(如
https://github.com/username/repo.git),而非 SSH(git@github.com:)——后者不走 GitHub API,Token 无效
CI 环境下 Token 配置容易丢失
GitHub Actions、GitLab CI 等环境默认不继承本地 ~/.composer/auth.json,每次 job 启动都是干净容器。光靠缓存或预装配置不可靠。
正确做法:
- 在
composer install步骤前,显式运行composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - 确保 CI 的 secret 名称与命令中引用一致(如
GITHUB_TOKEN),且该 secret 是你生成的 PAT,不是 GitHub 默认提供的secrets.GITHUB_TOKEN(它权限不足) - 避免在 CI 中使用
--prefer-source,它强制走 Git 克隆,绕过 zipball 下载路径,反而更依赖 SSH/HTTPS 连通性,容易因认证失败卡死
真正卡住的地方,往往不是网络本身,而是 Composer 在限流后自动降级重试——它不会告诉你“我被限了”,只会沉默等待超时。配 Token 后,90% 的“超时”问题会在 10 秒内消失。别调 timeout,别换源,先看 composer diagnose 里的 GitHub API 行。











