应调process-timeout,因其专控git clone、unzip等子进程超时,默认300秒,建议设为1200秒;http.timeout仅影响HTTP下载,对子模块无效。

拉取第三方组件超时,90%的情况不是网络慢,而是 Composer 默认的 process-timeout 太短,卡在 git clone 或 unzip 这类子进程上——调 http.timeout 完全没用。
为什么 http.timeout 对子模块无效
Composer 下载包分两类路径:dist(ZIP 包)走 HTTP,用 http.timeout;而 type: git / svn / path 的依赖,直接调系统命令(如 git clone),属于“外部子进程”,完全绕过 HTTP 层。日志里一旦出现 Executing command (CWD: ...): git clone --no-checkout 就说明已进入 process 超时控制范围。
-
http.timeout只影响 ZIP 下载、API 请求等 HTTP 操作 -
process-timeout是唯一能管住git、svn、php等子命令的配置项 - 默认值是 300 秒(5 分钟),对国内弱网或私有 GitLab 往往不够
怎么设 process-timeout 才真正生效
三个生效层级,优先级从高到低:环境变量 > 命令行参数 > 配置文件。CI 环境推荐用环境变量,本地开发用命令行最灵活。
- 临时生效(单次命令):
composer install --timeout=1200 - 全局永久生效:
composer config -g process-timeout 1200(写入~/.composer/config.json) - 环境变量最高优:
COMPOSER_PROCESS_TIMEOUT=1200 composer install,Docker 或 GitHub Actions 中直接 export 即可
Git 自身卡死怎么办:Composer 调 timeout 只是“等得更久”
如果 process-timeout 加到 1200 还卡住,大概率是 Git 在底层挂起,常见原因有:
- DNS 解析慢或失败 → 改用 HTTPS 协议:
composer config -g github-protocols https - SSH 认证阻塞(比如没配 key 或 agent)→ 直接换 HTTPS URL,或强制 SSH 加超时:
git config --global core.sshCommand "timeout 300 ssh" - GitHub API 限流(尤其没 Token 时)→ 在
~/.composer/auth.json里加{"github-oauth": {"github.com": "xxx"}},Token 需带repo权限 - 私有 GitLab 不通 → 先在终端手动跑
git clone https://your.gitlab.com/group/repo.git,确认基础连通性
镜像源对子模块根本不起作用
阿里云、腾讯云等 Composer 镜像只加速 Packagist 上的 dist ZIP 包下载,对 "type": "vcs" 或 "type": "git" 这类依赖,Composer 仍会直连原始 Git 地址。哪怕你配置了 https://mirrors.aliyun.com/composer/,只要 composer.json 里写了 "repositories": [{"type": "vcs", "url": "git@xxx"}],镜像就完全不介入。
这意味着:子模块超时问题,永远要从 Git 连通性、认证、网络策略入手,而不是换镜像。


















