卡在Downloading https:// 该调http-basic-timeout(Composer 2.2+)或http.timeout(旧版),它控制DNS解析、TLS握手、首字节等待及整个body传输总时间,默认300秒,与process-timeout无关;同时须确保PHP的default_socket_timeout不低于该值。

Composer 超时不是单一参数能解决的,必须同时调 process-timeout 和 http-basic-timeout(或旧版 http.timeout),否则总有一个会先掐断流程。
卡在 Downloading https:// 该调哪个 timeout?
这是 HTTP 层超时,和 process-timeout 完全无关。错误里常带 cURL error 28、反复 retry 或直接 Connection timed out。
-
http-basic-timeout(Composer 2.2+)或http.timeout(旧版)控制 DNS 解析 + TLS 握手 + 首字节等待 + 整个 body 传输的总时间,默认仅 300 秒 - 项目级最稳:运行
composer config http.timeout 600,写入当前composer.json的config段 - 全局生效:用
composer config -g http-basic-timeout 1200,写入~/.composer/config.json - 临时覆盖优先级最高:设环境变量
COMPOSER_HTTP_TIMEOUT=1200,再跑命令 - 务必同步检查 PHP 的
default_socket_timeout(用php -i | grep default_socket_timeout查),若它比你设的http-basic-timeout小,连接会被 PHP 提前掐断——常见值是 60,必须一起调高
The process "" exceeded the timeout 错误该调谁?
这是子进程执行太久被杀,比如 git clone、unzip、运行 post-install-cmd 脚本。错误里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 可看到最后卡在哪条命令上。
-
process-timeout控制单个外部命令最大执行时间,默认 300 秒,和 HTTP 完全无关 - 全局改:运行
composer config -g process-timeout 1800(30 分钟),写入~/.composer/config.json - 项目级改:在
composer.json顶层加"config": {"process-timeout": 1200} - 临时覆盖:用
--timeout=1200(注意等号不能少)或环境变量COMPOSER_PROCESS_TIMEOUT=1800 - 设为 0 表示禁用超时,不推荐——网络或磁盘异常时进程会无限挂起,CI 流水线直接卡死
全局安装(composer global require)为什么总失效?
因为全局命令只读 ~/.composer/config.json 和环境变量,完全忽略项目配置。常见静默失败点:
- 配镜像漏写
type参数:正确命令是composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,缺中间composer就静默失败 - 用
sudo执行,结果写进/root/.composer/config.json,但普通用户运行时读的是$HOME/.composer/config.json - PHP 禁用了
putenv()(见php.ini中disable_functions),导致composer config -g写配置失败却不报错 - 没清缓存,旧的
packages.json元数据还在本地,根本不会发请求,自然看不到镜像是否生效 - 验证是否真生效:先
composer clear-cache,再composer global require monolog/monolog -vvv 2>&1 | grep "Downloading",看 URL 是不是https://mirrors.aliyun.com/composer/
最容易被忽略的一点:两个 timeout 必须配对调整,且 http-basic-timeout 不能高于 PHP 的 default_socket_timeout;否则你以为调高了,其实 PHP 底层早把连接关了。


















