根本原因是GitHub API限流(每小时60次)和Git协议直连,镜像仅加速元数据与ZIP下载,不接管Git克隆;需同时配置GitHub Token(composer config -g github-oauth.github.com)、Git HTTPS代理及清理composer.lock。

不是镜像没配好,而是你根本没配对地方——GitHub包慢的根因是API限流+Git协议直连,单靠换镜像源解决不了。
为什么配了阿里云/清华镜像还是卡在Downloading github.com?
镜像只加速 packagist.org 的元数据查询和 ZIP 包下载,但不接管 Git 克隆。一旦 composer.lock 里记录的是 source.url 为 https://github.com/xxx/yyy.git 或 git@github.com:xxx/yyy,Composer 就会绕过镜像,直接走 git clone —— 这部分流量完全不受 repo.packagist 控制。
- 现象:日志里出现
Cloning into 'vendor/xxx'或反复重试https://codeload.github.com/ - 验证方式:手动执行
git clone https://github.com/composer/composer,如果同样慢,说明是 Git 层问题 - 别指望
composer config --repository能改掉已锁在composer.lock里的 dist URL;删 lock 文件再 install 才生效
GitHub API 403 rate limit exceeded 怎么破?
未认证请求每小时仅 60 次,而 Composer 在解析依赖时会高频调用 api.github.com(查 tag、读 composer.json、获取 release 列表)。加 Token 不是为了“登录”,而是把限额拉到 5000+/小时,让元数据链路跑通。
- 必须用
composer config -g github-oauth.github.com <token>,github.com不能写成api.github.com或www.github.com - Token 必须勾选
repo(含public_repo),read:packages仅当用 GitHub Packages 时需要 - 别手写
~/.composer/auth.json;手动编辑易格式错误,且权限必须是600(chmod 600 ~/.composer/auth.json) - 验证是否生效:
composer diagnose应显示GitHub API: OK且rate limit: 5000
Git 克隆卡住,该配 HTTP 代理还是 SSH?
推荐配 Git 的 HTTPS 代理,而非全局环境变量或 Composer 自身的 http-proxy。前者精准控制 Git 流量,后者容易误劫镜像请求。
- 执行:
git config --global http.https://github.com.proxy http://127.0.0.1:7890(假设代理监听在 7890) - 不要给
http://或本地地址设代理,否则镜像请求也被转发,反而失效 - 若用 SOCKS5(如 1080),需先用
privoxy转成 HTTP 代理,再喂给 Git - 避免在
php.ini里设http_proxy环境变量——这会让所有 PHP HTTP 请求(包括镜像)都走代理
镜像 + 代理 + Token,三者怎么共存不打架?
关键在分层:Packagist 元数据走镜像,GitHub API 走 Token 认证,Git 克隆走 Git 代理。三者必须隔离配置,混用就会互相干扰。
- 清掉所有
http-proxy/https-proxy全局配置(composer config -g --unset http-proxy),它们只该用于 packagist.org,但现在你用镜像了 - 确认
composer config -g repo.packagist已设为国内源(如https://mirrors.tuna.tsinghua.edu.cn/composer/) -
github-oauth.github.com和git config --global http.https://github.com.proxy同时存在,互不干扰 - CI/CD 中注意:
sudo composer config写入的配置,普通用户进程可能读不到;检查$COMPOSER_HOME路径和属主是否一致
最常被忽略的点:你以为配了 Token 就万事大吉,但 composer.lock 里残留的旧 dist URL 仍在直连 GitHub,或者 Git 代理没生效导致克隆失败——这两处不清理,再好的 Token 也白搭。


















