process-timeout应设为1200(开发)或1800(CI),因默认300秒易在git clone/unzip时超时;必须同步调高PHP default_socket_timeout,且优先使用COMPOSER_PROCESS_TIMEOUT环境变量确保生效。

process-timeout该设多少才不卡在git clone或unzip
Composer报The process "git clone ..." exceeded the timeout或卡在unzip阶段,说明子进程执行超时,必须调process-timeout——它和HTTP下载完全无关,只管git、unzip、post-install-cmd这类外部命令。
默认值300秒(5分钟)对中大型项目或弱网环境极容易触发。实测建议:
- 普通开发机:设为
1200(20分钟)已足够 - CI/CD环境(如GitHub Actions):推荐
1800(30分钟),并配合环境变量兜底 - 国内私有GitLab/自建仓库:若SSH握手慢或DNS解析久,可设为
3600,但需同步检查ssh_config和/etc/resolv.conf
注意:process-timeout单位是秒,且不能设为0来“禁用”——某些Composer版本会将其解释为“立即超时”,应设为一个足够大的整数。
http.timeout和PHP的default_socket_timeout必须同步调
当错误里出现cURL error 28、反复retry后失败,或卡在Downloading https://...,这是HTTP层超时,只由http.timeout控制(Composer 2.x起生效)。
但光改http.timeout没用:PHP底层的default_socket_timeout会提前掐断连接。常见情况是CLI模式下该值仍为默认60,远低于你设的http.timeout=600。
验证并修复步骤:
- 运行
php -i | grep default_socket_timeout查当前值 - 若≤ 300,需在
php.ini中显式修改:default_socket_timeout = 600 - 重启CLI环境(或直接用
php -d default_socket_timeout=600 composer install临时覆盖)
不配齐这两项,哪怕http.timeout设再大也白搭。
全局配置必须用--global,手改config.json风险极高
全局timeout设置唯一安全方式是composer config --global process-timeout 1200或composer config --global http.timeout 600。漏掉--global(或-g)会误写入当前项目的composer.json,导致后续composer install行为异常且报错晦涩。
手改~/.composer/config.json极易出错:
- JSON格式错一个逗号或引号,所有Composer命令直接报
JSON decode error,无具体行号提示 - 路径拼写错误(如写成
~/.composer/composer.json而非~/.composer/config.json)会导致配置被忽略 - 嵌套键如
repos.myrepo.url必须分步设置,一次性写全会静默失败
执行后可用composer config --global --list确认是否生效。
CI/CD中别信默认值,环境变量优先级最高
在Docker容器、GitHub Actions或Jenkins里,配置文件可能被覆盖或未加载。最稳做法是用环境变量,它优先级高于config.json和composer.json:
-
COMPOSER_PROCESS_TIMEOUT=1800→ 控制process-timeout -
COMPOSER_HTTP_TIMEOUT=600→ 控制http.timeout
特别注意:
- GitHub Actions中,必须显式写成
env: { COMPOSER_PROCESS_TIMEOUT: 1800 },写进run:里用export无效 - Docker中若用了
docker run --stop-timeout,系统会在超时前kill掉整个容器,Composer根本来不及响应 - 某些旧版Composer对
COMPOSER_HTTP_TIMEOUT支持不全,可降级兼容:同时设COMPOSER_PROCESS_TIMEOUT并加--no-plugins排除插件干扰
真正卡住时,timeout只是表象;内存不足、DNS污染、镜像源未切换、vendor/下存在损坏symlink,都可能伪装成超时。先跑composer diagnose,再看-vvv输出最后一行命令是什么,比盲目加timeout更有效。


















