必须同时配置 GitHub Token 和更换镜像源。仅换镜像不配 Token 会导致 dev-main、私有库或 fork 包仍直连 GitHub API 而限流;仅配 Token 不换镜像则国内易 TLS 失败。需执行 composer config --global github-oauth.github.com token、chmod 600 ~/.composer/auth.json,并设置镜像为 https://mirrors.aliyun.com/composer/,CI 环境应使用 COMPOSER_AUTH 环境变量传递认证信息。

直接换镜像源 + 配 GitHub Token 是唯一可靠路径。只换镜像不配 Token,遇到 dev-main、私有仓库或 fork 包仍会卡在 Resolving packages;只配 Token 不换镜像,则国内网络下大概率 TLS 握手失败或超时。
为什么 composer install 卡在 “Loading composer repositories” 或报 403
这不是连接 GitHub 失败,而是 Composer 在调用 https://api.github.com/ 时被限流或拒绝——镜像源(如阿里云)完全不代理这个域名的请求。只要依赖里含以下任一情况,就会直连 GitHub API:
-
"monolog/monolog": "dev-main"这类开发分支写法 -
"type": "vcs"且"url": "https://github.com/xxx" - 依赖链中某个包的
source指向了 fork 后未更新的 GitHub 地址
未认证请求每小时仅 60 次,CI 环境或公司出口 IP 下极易撞墙。错误日志里出现 403 Forbidden 或 rate limit exceeded 就是明确信号。
必须同时完成两件事:配 Token + 换镜像
缺一不可,顺序不重要,但两者都得生效:
- 执行
composer config --global github-oauth.github.com your_token_here,token 至少勾选public_repo(若涉及 fork 或组织库,需加repo) - 检查
~/.composer/auth.json权限是否为600:chmod 600 ~/.composer/auth.json,否则 Composer 静默忽略 - 配置镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾必须带/) - 验证是否生效:
composer config -g repo.packagist输出应为完整 JSON;composer diagnose中应显示GitHub API: OK
CI 环境(GitHub Actions / Codespaces)特别处理
全局配置在 CI 中往往失效,因为用户权限、目录缺失或缓存污染:
- GitHub Actions 中不要用
composer config --global,改用环境变量:COMPOSER_AUTH='{"github-oauth":{"github.com":"your_token"}}' - Codespaces 中同样走
COMPOSER_AUTH,避免把 token 写进auth.json提交到仓库 - 务必清掉旧缓存:
composer clear-cache,并删除vendor/和composer.lock后重装(尤其首次切换镜像+Token 时) - 运行
composer install -vvv,搜索日志里的git clone和GET https://mirrors.aliyun.com/,确认实际走的是镜像和认证通道
最常被忽略的是 auth.json 权限和 COMPOSER_AUTH 的 JSON 格式——少一个引号、多一个逗号,CI 就静默退回到未认证状态,而你还在查 DNS 或换源地址。


















