配GitHub Personal Access Token可将API限额从60次/小时提升至5000次/小时,解决composer install卡在“Resolving packages”并报403的问题,关键需正确生成token(勾选repo权限)、执行composer config --global github-oauth.github.com <token>、设置auth.json权限为600,并验证composer diagnose显示GitHub API: OK。

直接配 GitHub Personal Access Token 就行,不配就永远卡在每小时 60 次的匿名限额里。
为什么 composer install 卡在 “Resolving packages” 并报 403
Composer 在解析 dev-master、dev- 开头的分支、私有仓库 tag 列表,或依赖里含 fork 后没改 "source" 的包时,会密集调用 https://api.github.com/。这些请求默认不带认证头,GitHub 就当你是“匿名游客”,按 IP 限流:每小时最多 60 次——跟换机器、清缓存、重装 Composer 都无关。
- 哪怕你只装一个包,只要它依赖 5 个 GitHub 上的
dev分支,就可能直接耗尽额度 - 公司/学校共享出口 IP?那 60 次是大家共用的,更容易撞墙
- 错误高发于 CI 环境反复重试、
composer create-project或composer update拉取大量开发版依赖时
怎么用 composer config --global github-oauth.github.com 配 token
配一个 GitHub Personal Access Token,就能把限额从 60 升到 5000 次/小时。关键是两步都得做对,缺一不可:
- 去
https://github.com/settings/tokens/new新建 token,勾选public_repo(公开项目够用,不用给admin:org或delete_repo) - 执行
composer config --global github-oauth.github.com <token>,token 会写进~/.composer/auth.json - 立刻检查权限:
chmod 600 ~/.composer/auth.json——权限不是 600,Composer 会静默忽略该文件,退回到未认证状态 - 验证是否生效:
composer diagnose输出里看到GitHub API: OK才算真正通了
composer config --global 配了却还报限速?常见失效场景
Token 配了 ≠ 生效。以下情况会让 Composer 继续走未认证通道:
- 运行
composer install的用户和执行composer config --global的不是同一个(比如用sudo安装,但 config 是普通用户配的) - 项目根目录下存在
auth.json,它会覆盖全局配置;用composer config --list查看实际生效位置 - token 已被 GitHub 删除或过期(classic token 默认永不过期,但 fine-grained token 有明确有效期)
- PHP 禁用了
curl或 SSL 验证失败(尤其某些旧版 CentOS),导致Authorization头根本发不出去 - 别混淆 Packagist Token 和 GitHub Token
验证 token 是否真被 Composer 使用
光看 composer config --global github-oauth.github.com 输出前几位没用,得确认请求实际带了头:
- 运行
composer install -v,日志中出现Using GitHub token from configuration才算真正启用 - 手动触发一次 API 请求验证:
curl -H "Authorization: token <your_token_here>" https://api.github.com/rate_limit,检查返回中的rate.limit字段:若为 5000,说明 token 有效;若仍是 60,说明请求未携带 token 或 token 无效
最容易被忽略的是 ~/.composer/auth.json 权限和多用户环境下的配置归属——这两个点一错,token 就等于没配。


















