Composer安装卡在Downloading...主因是dist下载依赖GitHub API(如api.github.com),而该域名常被DNS污染或HTTPS干扰;推荐方案为全局配置腾讯云或阿里云镜像源,或临时使用--prefer-source参数改用git clone。

Composer 默认从 packagist.org 拉取包,但国内或受限网络下常因 GitHub 域名解析失败、API 限流或归档下载(dist)被阻断导致安装卡在 Downloading... 或报 Failed to download。直接改用 GitHub 归档下载包(.tar.gz)本身不能“提升安装率”,关键在于绕过 GitHub API 和域名依赖,改走稳定镜像或本地缓存路径。
为什么默认 dist 下载会失败
Composer 安装时优先使用 dist(归档包),其 URL 格式通常为:https://api.github.com/repos/{vendor}/{repo}/tarball/{reference} —— 这个地址依赖 GitHub API 认证与限流策略,且国内 DNS 经常无法解析 api.github.com 或连接超时。
即使你手动访问 GitHub 页面能打开,api.github.com 的 HTTPS 请求仍可能被干扰。
强制使用 GitHub 归档镜像源(推荐)
不修改项目配置,全局替换 Packagist 的 dist 镜像源为可信镜像(如腾讯云、阿里云提供的 GitHub Proxy)。操作简单、兼容性好:
- 运行
composer config -g repo.packagist composer https://packagist.phpcomposer.com
(已停用,不推荐) - 改用腾讯云镜像:
composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/
- 或阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
这些镜像已预缓存主流包的 GitHub dist 归档,并将原始 api.github.com 请求转为内网或代理拉取,不再直连 GitHub。
禁用 dist、强制走 source(仅调试用)
若镜像仍不稳定,可临时跳过 dist,改用 source(git clone),但注意:这会显著变慢、需要 git 环境、且某些私有包不支持:
- 全局禁用 dist:
composer config -g prefer-stable true && composer config -g prefer-lowest false
(无效)→ 正确命令是:composer config -g disable-tls false && composer config -g github-protocols ["https"]
(不相关)→ 实际应使用:composer config -g --no-plugins allow-plugins.composer/installers true
(无关)→ 正确开关是:composer config -g --no-plugins use-github-api false
- 更直接方式:加
--prefer-source参数:composer install --prefer-source
或composer update --prefer-source
- 该参数让 Composer 放弃下载
.tar.gz,改用git clone https://github.com/{vendor}/{repo}.git,只要github.com页面可访问(非 API),就大概率成功 - ⚠️ 注意:
git clone需要系统已安装git,且部分企业防火墙会拦截git://协议,建议提前运行git config --global url."https://".insteadOf git://
自建 dist 镜像或离线 fallback(高阶)
对 CI/CD 或内网环境,可预下载并托管 dist 包:
- 用
composer archive打包单个包:composer archive vendor/package --format=zip --dir=./dist
- 或通过
composer show -s vendor/package查看实际 dist URL,再用wget或浏览器下载.tar.gz文件 - 将文件放到内部 HTTP 服务(如 Nginx)目录,例如
https://internal-mirror.example/dist/vendor-package-ref.tar.gz - 然后在
composer.json中添加自定义仓库:{ "repositories": [ { "type": "package", "package": { "name": "vendor/package", "version": "1.2.3", "dist": { "url": "https://internal-mirror.example/dist/vendor-package-1.2.3.tar.gz", "type": "tar" } } } ] }
这种方式最可靠,但维护成本高;日常开发中,优先用腾讯/阿里镜像 + 必要时 --prefer-source 就能覆盖 95% 的受限网络场景。
真正卡住安装的,往往不是“没用 GitHub 归档”,而是 Composer 还在傻等 api.github.com 返回 200。把 use-github-api 关掉、换镜像源、或切到 source,三者选其一,基本就通了。别在 composer.json 里硬写 GitHub tarball 链接——那既不安全,也不可持续。










