应调 http.timeout 参数,它控制 DNS 解析、TLS 握手、首字节等待及整个 body 传输的总时间(默认300秒),专用于解决 Downloading https:// 卡住问题;弱网下需同步调高 PHP 的 default_socket_timeout 防止底层提前中断。

直接改 http.timeout,不是 process-timeout,也不是 config.timeout——后者根本不存在。
卡在 Downloading https:// 时该调哪个参数
这是 HTTP 请求阶段卡住,比如拉 packages.json、下载 ZIP 包,错误里常带 cURL error 28 或反复 retry 后失败。它不看 process-timeout,只认 http.timeout(Composer 2.x)。
-
http.timeout控制 DNS 解析 + TLS 握手 + 首字节等待 + 整个 body 传输的总时间,单位秒,默认仅 300(5 分钟),弱网下极易触发 - 项目级最稳:运行
composer config http.timeout 600,写入当前composer.json的config段,可提交、可复现 - 全局生效:用
composer config -g http.timeout 600,写入~/.composer/config.json - 临时覆盖优先级最高:
COMPOSER_HTTP_TIMEOUT=1200 composer install,适合 CI 调试 - 注意:
php -i | grep default_socket_timeout查出的 PHP CLIdefault_socket_timeout若低于你设的http.timeout,会提前掐断连接——常见值是 60,务必同步调高
为什么改了 process-timeout 还是超时
process-timeout 管的是 git clone、unzip、post-install-cmd 这类子进程,和 HTTP 下载无关。如果你看到错误里明确含 The process "" exceeded the timeout,才该调它;如果只是 failed to open stream: Connection timed out,调它没用。
- 错误现象:
[RuntimeException] The process "git clone ..." exceeded the timeout - 它默认 300 秒,全局改用
composer config -g process-timeout 1800 - 但别设为 0——真出权限或路径错误时,你会卡死无反馈
- CI 环境建议用环境变量兜底:
COMPOSER_PROCESS_TIMEOUT=2000,某些 Composer 版本对它更敏感
http-basic-timeout 是什么,什么时候用
这个参数只在 Composer 2.2+ 支持,控制单次 HTTP 请求的连接与读取时限(比如 GET 一个 zip 包),和 http.timeout 的“端到端总耗时”不同,它是“单次请求内部的等待上限”。
- 默认 60 秒,比
http.timeout更细粒度;若你遇到“连得上但首字节等太久”,它比调大http.timeout更精准 - 临时用:
composer update --http-basic-timeout=300 - 永久用:
composer config -g http-basic-timeout 300 - 注意:它不替代
http.timeout,两者独立生效;解析快但下载慢时,只调一个仍可能失败
真正容易被忽略的是 PHP 底层的 default_socket_timeout——它像一道隐形闸门,哪怕你在 Composer 里设了 1200 秒,PHP 自己先在 60 秒把 socket 关了,一切白搭。每次调高 http.timeout,必须顺手查并同步调高它。


















