必须同时调整process-timeout和http.timeout:前者控制git clone、unzip等子进程执行时间,默认300秒,需设为1200或更高;后者控制http请求全周期(含dns、tls、下载),默认300秒,弱网下应设为600以上,并同步调高php的default_socket_timeout。

process-timeout 和 http.timeout 必须同时调,只改一个大概率白忙。
process-timeout 控什么、怎么设
它管的是子进程执行时间:比如 git clone、unzip、tar -xzf、甚至 post-install-cmd 里的 php artisan 命令。错误里明确带 The process "" exceeded the timeout 就是它。
- 默认值是 300 秒(5 分钟),解压一个 200MB 的 dist 包很容易超
- 设为 0 表示禁用超时,但不推荐——卡死无响应很难排查
- 项目级生效:在
composer.json顶层加"config": { "process-timeout": 1800 } - 全局生效:运行
composer config -g process-timeout 1800 - 临时覆盖(CI 最常用):
COMPOSER_PROCESS_TIMEOUT=1800 composer install
注意:--timeout=1800 是命令行参数,必须带等号;写成 --timeout 1800 会被静默忽略。
http.timeout 控什么、为什么不能只靠它
它控制整个 HTTPS 请求生命周期:DNS 解析 + TLS 握手 + 首字节等待 + 完整 body 下载。卡在 Downloading https://... 且报 cURL error 28 就是它。
- 默认仅 300 秒,弱网下拉一个大 ZIP 包直接触发
- 它不能写进
composer.json的config段(config.timeout是无效字段,早被废弃) - 项目级:用
composer config http.timeout 1200(写入当前项目的composer.json) - 全局:用
composer config -g http.timeout 1200 - 临时:用
COMPOSER_HTTP_TIMEOUT=1200 composer install
关键陷阱:PHP 底层的 default_socket_timeout 若低于你设的 http.timeout,连接会在底层被掐断。运行 php -i | grep default_socket_timeout 查值,若为 60,必须同步调高——例如在 php.ini 里设 default_socket_timeout = 1200。
http-basic-timeout 是干啥的、什么时候要动它
Composer 2.2+ 新增,只管单次 HTTP GET 的连接和读取(比如拉 packages.json 或 ZIP 包头几 KB),不涉及整个 body 下载。适合防握手慢导致的早期中断。
- 默认是 60 秒,国内镜像偶尔首包延迟高,容易在这步失败
- 可全局设:
composer config -g http-basic-timeout 300 - 也可临时用:
composer install --http-basic-timeout=300 - 它和
http.timeout不冲突,但http.timeout更“粗”,http-basic-timeout更“细”
真正卡住时,timeout 往往只是表象。内存不足(memory_limit https-proxy)、或 GitHub API 被限流(需配 github-oauth token),都可能伪装成超时。先看错误里有没有 cURL error 28、403、rate limit 这类关键词,再决定调哪个参数。











