Composer超时需同时配置http-basic-timeout(控制DNS/TLS/下载全过程,默认60秒)、process-timeout(控制git/unzip等子进程,默认300秒)及PHP的max_execution_time(针对自定义脚本),三者独立生效,缺一不可;优先切换国内镜像源治本。

Composer 的“超时”不是单一参数,而是三层独立控制:HTTP 下载、子进程执行、PHP 脚本运行。只调一个,大概率还是失败。
卡在 Downloading https:// 该调 http-basic-timeout
错误现象常见为 cURL error 28、反复 retry 后失败,或卡在 Downloading https://repo.packagist.org/packages.json 这类行。这不是 process-timeout 在起作用,而是单次 HTTP 请求总耗时(DNS + TLS + 首字节 + body 传输)被掐断。
-
http-basic-timeout默认仅 60 秒(Composer 2.1 及更早)或 300 秒(2.2+),弱网或大包极易触发 - 项目级生效:运行
composer config http-basic-timeout 300,写入当前composer.json的config段 - 全局生效:运行
composer config -g http-basic-timeout 300,写入~/.composer/config.json - 临时覆盖优先级最高:设环境变量
COMPOSER_HTTP_TIMEOUT=600再执行命令(注意:环境变量名是COMPOSER_HTTP_TIMEOUT,不是COMPOSER_HTTP_BASIC_TIMEOUT) - ⚠️ 关键遗漏点:PHP CLI 的
default_socket_timeout若低于你设的值(常见默认是 60),会提前中断连接。查它:php -i | grep default_socket_timeout,必要时同步调高(如通过php -d default_socket_timeout=600 composer install)
报 The process "" exceeded the timeout 该调 process-timeout
错误信息里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 可看到最后卡在哪条命令上——比如 git clone、unzip、php scripts/post-install.php。这是子进程执行超限,和 HTTP 完全无关。
-
process-timeout控制每个外部命令(非 PHP 主进程)的最大运行时间,默认 300 秒 - 项目级固化:在
composer.json顶层加"config": {"process-timeout": 1800} - 全局统一:运行
composer config -g process-timeout 1800 - 临时覆盖:用
--process-timeout=1800(必须带等号)或环境变量COMPOSER_PROCESS_TIMEOUT=1800 - 设为 0 表示禁用超时,但不推荐——一旦网络异常或磁盘满,进程会无限挂起,CI 流水线直接卡死
自定义脚本(post-install-cmd 等)超时由 PHP 控制
很多人在 composer.json 的 scripts 里写了耗时脚本,结果报 Maximum execution time of 300 seconds exceeded。这不是 Composer 配置能改的,是 PHP 自身机制在起作用。
- Composer 的
config.timeout或process-timeout对它完全无效 - 最稳方式:调用前加
php -d max_execution_time=0,例如php -d max_execution_time=0 composer install - 若用
composer run-script,同样生效:php -d max_execution_time=900 composer run-script post-build - 脚本内也可用
set_time_limit(0),但必须尽早调用,且不能在disable_functions中被禁用
比调 timeout 更关键的是镜像和回源策略
很多“超时”本质是连不上 packagist.org,不是时间不够。国内用户不配镜像,调再大 timeout 也白搭。
- 必须切换国内镜像源,例如阿里云:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 禁用 packagist.org 回源(防止 fallback 到境外慢链):
composer config -g repos.packagist.org false - 镜像配置优先级高于 timeout:哪怕你设了
--timeout=3600,没镜像照样卡在 DNS 解析或 TLS 握手阶段
真正容易被忽略的点是:三类 timeout(HTTP、process、PHP)各自独立,且受不同底层机制约束;环境变量优先级最高,但设为 0 有卡死风险;而所有 timeout 调整都压不过一个事实——没镜像,就等于没通路。


















