Composer install 卡在 GitHub 是因未认证的 API 请求被限速(60次/小时),需配置 GitHub Personal Access Token:composer config -g github-oauth.github.com ,使请求升至5000次/小时。

Composer install 时卡在 github.com 或提示 rate limit exceeded
这是 GitHub 对未认证的 API 请求做了严格限速(每小时 60 次),而 Composer 默认走 GitHub API 拉取元数据(比如 composer.json 中的包信息、tag 列表、zipball 地址),不是直接下载 zip 包本身。一旦项目依赖多、或团队共用出口 IP,很容易触发 403 rate limit exceeded 或长时间无响应。
- 真正被限速的是
https://api.github.com/的请求,不是https://github.com/页面或 git clone - Composer 2.2+ 默认启用
github-oauth认证,但只对已配置 token 的域名生效,不自动 fallback - 错误典型表现:
Could not fetch https://api.github.com/repos/.../contents/composer.json,或卡在Loading composer repositories with package information
怎么配 GitHub Personal Access Token 让 Composer 走认证通道
Token 是最直接有效的解法,它把每小时 60 次提升到 5000 次,并且支持私有仓库访问。关键不是“生成 token”,而是让 Composer 正确读取并用于 GitHub API 域名。
- 去
https://github.com/settings/tokens/new创建 token,勾选repo(非public_repo)权限 - 执行命令写入全局配置:
composer config -g github-oauth.github.com <your_token_here></your_token_here> - 验证是否生效:
composer config -g github-oauth.github.com应输出 token 值 - 注意:token 必须是明文粘贴,不能带引号;如果用
composer.json本地配置,需确保该文件不提交到 Git
为什么用了 token 还报错?常见配置陷阱
Token 配置后仍失败,大概率是域名匹配没对上——Composer 只对完全匹配的 host 生效,不支持通配符或子域自动继承。
- 如果你用的是 GitHub Enterprise,必须配成
composer config -g github-oauth.your-ghe-domain.com <token></token>,而不是github.com - 某些镜像源(如阿里云、腾讯云 Composer 镜像)会替换 packagist.org 的 metadata URL,但不会改 GitHub API 请求地址,token 依然要配原域名
- 运行
composer diagnose会提示GitHub API is slow,这不是警告,是检测到未认证请求的明确信号 - CI 环境中,别把 token 写死在脚本里;用环境变量 +
composer config github-oauth.github.com "${GITHUB_TOKEN}"更安全
不想配 token?临时绕过 API 的替代方案
Token 是长期推荐方案,但调试或临时场景下可强制 Composer 跳过 GitHub API,改用 Git 协议直连——代价是首次安装变慢、无法用 dist 模式加速,且部分私有包可能不可用。
- 设置环境变量禁用 API:
export COMPOSER_NO_INTERACTION=1 && export COMPOSER_DISCARD_CHANGES=1,再加composer install --prefer-source - 原理:
--prefer-source让 Composer 改用git clone拉代码,绕开api.github.com查 tag 和 zipball - 缺点明显:每次都要完整 clone,
vendor体积大、速度慢;且若 GitHub SSH key 没配好,会卡在密码提示 - 不建议设为默认行为,仅用于排查或离线 CI 测试
Token 配置本身很简单,难的是意识到 Composer 的“限速”根本不在下载环节,而在元数据发现阶段——这点搞错,所有换镜像、加代理的操作都是白忙。


















