Composer 默认下载失败时重试3次,由COMPOSER_RETRY环境变量或全局config.json中的retry配置控制,仅作用于HTTP/HTTPS包下载,不适用于git clone或已缓存包。

composer install 或 update 卡在下载失败时默认重试几次?
Composer 默认对每个包下载请求只尝试 3 次,超时后直接报错退出,不会自动延长或重试更多次。这个行为由 http.max-redirects 和底层 cURL 的重试逻辑共同影响,但关键控制点其实是 retry 配置项 —— 它不显式暴露在命令行,必须通过配置文件或环境变量修改。
常见错误现象包括:file could not be downloaded: failed to open stream: Connection timed out、Connection refused、curl error 28(operation timeout),尤其在国内网络环境下高频出现。
- 该重试机制仅作用于 HTTP/HTTPS 包下载(如从 packagist.org 或私有 repo 拉 zip/tar),不适用于 git clone
- 重试次数不影响已缓存的包(
vendor/或~/.composer/cache中存在的包跳过下载) - 设置过高(比如
10)可能让失败过程拖得更久,但能避开瞬时网络抖动
如何用命令行临时提高重试次数?
最直接的方式是通过 COMPOSER_RETRY 环境变量覆盖默认值,无需改配置文件,适合 CI 或临时调试:
COMPOSER_RETRY=5 composer install
也可以写成一行 shell 命令(Windows 用户用 set COMPOSER_RETRY=5 && composer install):
COMPOSER_RETRY=8 composer update --no-interaction
-
COMPOSER_RETRY是 Composer 1.10+ 和 2.0+ 原生支持的环境变量,旧版本(如 1.9.x)不识别 - 值必须为纯数字,不能带空格或单位;设为
0表示禁用重试(不推荐) - 该变量只影响当前命令生命周期,不影响全局配置
永久修改重试次数:改 global config 还是 auth.json?
Composer 的重试次数属于「全局行为配置」,应写入全局配置文件(~/.composer/config.json 或 COMPOSER_HOME/config.json),而不是 auth.json(它只管认证信息)。
执行以下命令写入(会自动创建或合并):
composer config -g retry 6
- 生效后所有后续
composer install/update都默认重试6次 - 如果本地项目有
composer.json里写了"config": {"retry": 3},会覆盖全局值 - 注意:修改后无需重启终端或清缓存,下次运行即生效
为什么调高 retry 不一定能解决下载失败?
重试只是对抗短暂网络中断,不是万能解药。如果失败源于:
- DNS 解析失败(
Could not resolve host: packagist.org)→ 重试无效,需换 DNS 或加 hosts
- SSL 证书校验失败(
curl error 60)→ 要么关校验(secure-http: false),要么更新 CA 证书
- 源站限流或返回 429/503 → 多次重试反而加重被封风险,此时该切镜像源(如
https://packagist.phpcomposer.com 已停,可用 https://mirrors.aliyun.com/composer/)
- 本地代理或防火墙拦截了 HEAD 请求 → Composer 下载前会发 HEAD 探测,某些代理会丢弃它,导致误判失败
Could not resolve host: packagist.org)→ 重试无效,需换 DNS 或加 hostscurl error 60)→ 要么关校验(secure-http: false),要么更新 CA 证书https://packagist.phpcomposer.com 已停,可用 https://mirrors.aliyun.com/composer/)真正卡住的时候,先看日志里具体是哪一步失败,再决定调重试、换源、还是修网络链路 —— 重试参数只是工具箱里一把螺丝刀,不是扳手也不是电钻。










