卡在Downloading https:// 应调http-basic-timeout(2.2+)或http.timeout(旧版),二者控制单次HTTP请求全过程,默认60秒,弱网下需增至300~600秒,与process-timeout无关。

Composer 卡住不是网络差,而是它自己设了两道独立超时关卡——http-basic-timeout(或旧版 http.timeout)管下载,process-timeout 管解压和脚本执行。只调一个,大概率白忙。
卡在 Downloading https:// 该改哪个参数
这是单次 HTTP 请求卡死,错误里常带 cURL error 28 或反复 retry 后失败。它只响应 http-basic-timeout(Composer 2.2+)或 http.timeout(旧版),和 process-timeout 完全无关。
-
http-basic-timeout控制 DNS 解析 + TLS 握手 + 首字节等待 + 整个 ZIP 包传输的总时间,默认仅 60 秒(2.2+),弱网或大包建议设为300~600 - 旧版 Composer(http.timeout,默认 300 秒,也建议设为
600 - PHP CLI 的
default_socket_timeout必须 ≥ 你设的值(查法:php -i | grep default_socket_timeout),否则底层 socket 会在 60 秒就掐断连接 - 临时生效:
composer install --http-basic-timeout=300(2.2+)或COMPOSER_HTTP_TIMEOUT=600 composer install - 项目级持久化:
composer config http-basic-timeout 300(写入composer.json的config段)
报 The process timed out 该调哪项
错误里含 [RuntimeException] The process "" exceeded the timeout,说明是子进程执行太久被杀,比如 git clone、unzip、跑 post-install-cmd 脚本。它只看 process-timeout,和 HTTP 下载无关。
-
process-timeout控制单个外部命令最大执行时间,默认 300 秒,大项目或私有 Git 仓库建议设为1800(30 分钟) - 设为
0表示禁用超时,但不推荐——网络卡死时会无限挂起 - 项目级:
composer config process-timeout 1800(写入当前composer.json) - 全局生效:
composer config -g process-timeout 1800(写入~/.composer/config.json) - 临时覆盖优先级最高:
COMPOSER_PROCESS_TIMEOUT=1800 composer install
--timeout 参数到底管什么
--timeout 不是控制下载或解压,而是延长 Composer 主流程整体熔断阈值,默认 300 秒。它影响依赖解析 + 下载 + 解压 + 所有脚本执行的全过程,但不替代 http-basic-timeout 或 process-timeout。
- 必须带等号才生效:
composer install --timeout=1200✅,composer install --timeout 1200❌(静默忽略) - 只对当前命令生效,适合 CI/CD 临时调试
- 若卡在
Downloading https://,光加--timeout不够,必须同步设--http-basic-timeout - 环境变量
COMPOSER_PROCESS_TIMEOUT和COMPOSER_HTTP_TIMEOUT优先级高于配置文件,也高于--timeout
为什么换镜像比调 timeout 更治本
80% 的 “超时” 实质是源不稳定:DNS 污染、TLS 握手抖动、packagist.org 响应延迟。单纯加 timeout 只是“等得更久”,解决不了连接阶段就失败的问题。
- 国内推荐阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 配完必须清缓存:
composer clear-cache,否则仍可能读损坏的本地缓存 - 验证是否生效:
composer config -g repo.packagist应输出对应 URL;composer install --dry-run中下载链接要变成mirrors.aliyun.com - 注意:
"type": "git"的包会绕过镜像直连 GitHub,此时只能靠process-timeout+ Git 配置兜底
真正容易被忽略的是 PHP 底层 socket 限制和镜像回源干扰——哪怕所有 Composer 配置都调高了,default_socket_timeout 还是 60,或者镜像地址末尾多了一个 /,都会让 timeout 设置彻底失效。











