Composer 2.2+ 才支持自动重试,需同时配置镜像源、http.timeout 和 http.max-retries,缺一不可;仅设 --retries=5 而不换源或调超时,仍会因 cURL error 28 卡在下载阶段。

直接结论:Composer 2.2+ 才支持自动重试,且必须同时配镜像源 + http.timeout + http.max-retries,缺一不可;只设重试不换源,大概率还是超时。
为什么--retries=5没生效?
常见现象是加了参数但依然卡在 Downloading 后报 cURL error 28。原因很直接:
-
--retries只在 Composer 2.2+ 中可用,旧版本压根不识别这个参数 - 重试只触发于特定错误码(如
cURL error 6、28、7、56),但若卡在 TLS 握手或 DNS 解析阶段,可能直接中断而不进重试逻辑 - 重试默认最多 3 次,且延迟很短(首次 100ms,后续 500ms),对国内网络抖动不够友好
- 如果用了
COMPOSER_PROCESS_TIMEOUT环境变量,它会覆盖命令行参数,导致--retries被忽略
怎么让重试真正起作用?
不是加个参数就完事,得组合配置:
- 全局启用重试:
composer config -g http.max-retries 3(推荐值 3~5) - 同步拉高单次请求超时:
composer config -g http.timeout 600(单位秒,不能低于重试总耗时) - 补上连接级超时:
composer config -g http.connect-timeout 60,避免卡在 TCP 建连阶段 - 临时验证用环境变量更可靠:
COMPOSER_HTTP_TIMEOUT=600 COMPOSER_MAX_RETRIES=5 composer install
中文加速站(阿里/腾讯镜像)怎么才算真正生效?
很多人执行了换源命令,却仍走官方源——因为配置被覆盖或未落地:
- 确认是否真用了镜像:
composer config -g repos.packagist.org.url输出必须是https://mirrors.aliyun.com/composer/或类似地址,不是https://packagist.org - 项目级
composer.json中的repositories字段会**优先覆盖**全局配置,务必检查并删掉硬编码的packagist.org - 手动测镜像连通性:
curl -I https://mirrors.aliyun.com/composer/packages.json应秒回HTTP/2 200,否则说明 DNS、代理或防火墙挡住了 - Windows/macOS 下某些杀毒软件或代理工具(如 Fiddler)会劫持 HTTPS,导致 TLS 握手失败——此时重试和超时都无效,得关掉或导入其根证书
重试 + 镜像还失败?那大概率不是 HTTP 层问题
如果调了 http.timeout=600、max-retries=5、也确认镜像生效,仍卡住,就要跳出 Composer 看底层:
- 卡在
Cloning into 'xxx'?那是 Git 在 clone,跟 Composer 的重试无关,需设git config --global http.timeout 300 - 卡在
Generating autoload files?不是网络问题,是 PHP 扫描 vendor 文件太慢,尤其 WSL2 或 Docker for Mac 上 I/O 慢 - 报
cURL error 60?是证书问题,不是超时,得配cafile或更新系统 CA 证书链 - CI 环境里反复失败?别信“本地能跑”,必须挂载
$HOME/.composer/cache,否则每次都是全新下载
真正麻烦的从来不是重试次数或超时数字,而是网络路径中某一段(DNS、TLS、代理、镜像节点)出现非对称延迟——它可能只影响某个包、某个时刻,所以光调参数只是兜底,不是根治。











