插件卡住应调process-timeout,因其控制git clone、unzip、post-install-cmd等子进程执行时限,默认300秒易超时,需设为1200并同步调高PHP的default_socket_timeout。

直接调 process-timeout,不是 http.timeout,也不是 http-basic-timeout —— 插件(如自定义 installer、post-install-cmd 脚本、或通过 VCS 克隆的包)卡住时,根本不在 HTTP 下载阶段,而是在执行外部命令环节。
卡在 Executing command 或 post-install-cmd 就该改 process-timeout
Composer 报 The process "xxx" exceeded the timeout 或卡在 Executing command (CWD: ...) 时,说明它正在跑 git clone、unzip、php artisan、甚至第三方插件的 install 逻辑。这些都算“子进程”,受 process-timeout 控制,和网络无关。
-
process-timeout默认仅 300 秒,对含大量文件的插件(如 Laravel Nova、某些私有 SDK)或慢速容器环境极易超时 - 设为
1200(20 分钟)是较稳妥的起点;CI 环境建议用环境变量兜底:COMPOSER_PROCESS_TIMEOUT=1200 - 不推荐设为
0:万一插件内部死循环或挂起 SSH,会无限等待,无法中断 - 注意:这个值不能写进
composer.json的config段(v2.x 忽略),必须用composer config -g process-timeout 1200或环境变量
插件走 git clone?还得看 Git 自身超时
很多插件声明为 "type": "git" 或直接依赖 GitHub URL,Composer 会调系统 git clone。此时即使 process-timeout 足够长,Git 本身卡在 DNS 或握手也可能拖住整个流程。
- 强制 Git 走 HTTPS(避开 SSH 认证失败):
composer config -g github-protocols https - 给 Git 加系统级超时(Linux/macOS):
git config --global core.sshCommand "timeout 300 ssh" - 验证是否生效:
git clone -v https://github.com/some/plugin.git看是否在 300 秒内退出
换镜像源对插件无效,别白忙
阿里云、腾讯等镜像只代理 composer 类型的包(即 packagist.org 上发布的 dist ZIP),对 git、svn、package 类型的插件完全不生效。你看到日志里还在 Cloning into 'xxx'...,就说明流量没走镜像。
- 检查插件来源:
composer show vendor/plugin-name -vvv看source字段是git还是dist - 若必须用 git 源,且国内访问 GitHub 慢,可配 Git 代理:
git config --global http.proxy http://127.0.0.1:7890(需对应代理工具端口) - 临时绕过插件安装(调试用):
composer install --no-plugins,确认是否插件本身导致阻塞
PHP 配置也会掐断插件执行
哪怕 Composer 和 Git 都设了超时,PHP 自身的 max_execution_time 或 default_socket_timeout 仍可能提前中止进程——尤其插件里含 file_get_contents、cURL 或 socket 操作时。
- 查当前 CLI 值:
php -r "echo ini_get('max_execution_time').PHP_EOL;",若为0或太小(如 30),需调整 - 关键项:
default_socket_timeout必须 ≥ 你设的process-timeout,否则 cURL 或 stream 操作会在中途被 PHP 强制关闭 - 临时提高:
php -d max_execution_time=0 -d default_socket_timeout=1200 composer.phar install
真正卡住插件的,往往不是“下载慢”,而是某层超时配置没对齐:Git 在等 DNS,PHP 在掐 socket,Composer 却在等一个永远不会回来的 exit code。调参前先 composer install -vvv 看最后一行,定位到具体命令再动手。


















