应调 http.timeout,它控制 HTTPS 下载全过程(DNS、TLS、首字节、body 传输)总时间,默认300秒,弱网易超时;若 PHP 的 default_socket_timeout 小于该值(如默认60秒),需同步调高,否则底层提前断连。

直接改 process-timeout 和 http.timeout 两个参数,缺一不可——前者管 unzip、git clone 这类子进程,后者管 HTTPS 下载本身;只调一个,卡在下载或卡在解压时照样失败。
卡在 Downloading https:// 该调哪个 timeout
这是 HTTP 传输阶段卡住,错误里常带 cURL error 28 或反复 retry 后失败。它只响应 http.timeout(Composer 2.x),和 process-timeout 完全无关。
-
http.timeout控制 DNS + TLS 握手 + 首字节等待 + 整个 ZIP 包 body 传输的总时间,默认仅 300 秒,弱网下极易中断 - 项目级生效:运行
composer config http.timeout 1200,写入当前composer.json的config段 - 全局生效:运行
composer config -g http.timeout 1200,写入~/.composer/config.json - 临时覆盖优先级最高:设置环境变量
COMPOSER_HTTP_TIMEOUT=1200再执行命令 - ⚠️ 注意:
php -i | grep default_socket_timeout查出的 PHP CLIdefault_socket_timeout若低于你设的http.timeout(常见默认值是 60),底层连接会被提前掐断
报 The process timed out 该调哪一项
错误信息里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 能看到最后那条卡住的命令,比如 unzip 或 git clone。这是子进程执行太久被杀,和 HTTP 下载无关。
-
process-timeout控制单个外部命令最大执行时间,默认 300 秒,必须单独调高 - 全局改:运行
composer config -g process-timeout 1800 - 项目级改:直接在
composer.json顶层加"config": {"process-timeout": 1200} - 临时覆盖:用
--timeout=1800(注意必须带等号,--timeout 1800会静默忽略) - 环境变量
COMPOSER_PROCESS_TIMEOUT=2000也可靠,且优先级高于配置文件
为什么改了 composer.json 的 config.timeout 没用
config.timeout 是无效字段 —— Composer 根本不认这个 key。你看到的旧文档或教程里写的这个配置,早已废弃多年。
- 真正起效的是三个独立参数:
http.timeout、process-timeout、http-basic-timeout - 其中
http.timeout不能通过写进composer.json的config段来设置(只支持命令行或环境变量) -
process-timeout和http-basic-timeout可以写进composer.json,但要注意版本:后者仅 Composer 2.2+ 支持 - 别在
composer.json里写"timeout": 600或"config.timeout": 600,纯属白忙
最易被忽略的点是 PHP 底层 socket 超时和 Composer 参数不匹配——哪怕你把 http.timeout 设成 1200,default_socket_timeout 还是 60,cURL 就会在 60 秒后直接断连,Composer 根本没机会等到自己的超时阈值。











