composer下载超时重试无效的根本原因是http.timeout过短且php default_socket_timeout未同步调高,需同时设http.timeout=600和php.ini中default_socket_timeout=600,否则单次请求仍被提前掐断。

直接调高 http.timeout 并同步放宽 PHP 底层限制,否则重试只是反复失败
卡在 Downloading https:// 时,重试无效的本质原因
Composer 的重试机制只在 HTTP 层生效(比如 cURL error 28),但它不会突破 http.timeout 设置的单次请求总时长。如果这个值太小(默认仅 300 秒),哪怕重试 3 次,每次也都在超时边缘中断,最终报错仍是“Connection timed out”或“cURL error 28”。更隐蔽的是:PHP 自身的 default_socket_timeout 若低于你设的 http.timeout,会提前掐断连接——查一下:php -i | grep default_socket_timeout,常见值是 60,必须同步改大。
必须同步调整的两个关键参数
只改一个,另一个就会成为瓶颈:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
http.timeout控 DNS 解析 + TLS 握手 + 首字节等待 + 整个 body 传输,建议设为600(10 分钟):运行composer config -g http.timeout 600 -
default_socket_timeout是 PHP 底层 socket 级别限制,需改php.ini中此项,或临时用php -d default_socket_timeout=600 composer install - 若用环境变量方式调试 CI,优先用
COMPOSER_HTTP_TIMEOUT=1200,它优先级最高
重试仍失败?先排除 IPv6 fallback 和镜像静默失效
很多“重试无果”其实是假超时:
- IPv6 fallback 会导致每个包多等 1–3 秒才切到 IPv4,上百个依赖叠加就是几分钟无日志——验证:
curl -v https://packagist.org 2>&1 | grep "Connected to",看到2a03:2880:类 IPv6 地址且后续卡住,基本就是它 - 镜像配置写错一个字符(比如少末尾
/、写成repos.packagist而非repo.packagist)会静默失效,必须用composer config -g repo.packagist看输出是否为完整 JSON 对象 - 换源后不执行
composer clear-cache,旧缓存仍走失败地址,重试毫无意义
process-timeout 不是用来救下载卡死的
如果你看到错误里明确含 The process "" exceeded the timeout 或 Executing command 后卡住,那才是 process-timeout 的管辖范围;但只要停在 Downloading https://,它就完全不参与——这时候调 process-timeout 是白费力气。真要调,也得配环境变量 COMPOSER_PROCESS_TIMEOUT,命令行 --timeout 对子进程不生效。
最常被忽略的一点:重试次数本身不可配,Composer 固定最多 3 次,它不会因网络差自动加次,只会把每次超时时间拉长。所以核心永远是“单次能撑多久”,而不是“重试几次”。










