应同时配置process-timeout(建议1200秒)和http.timeout(建议600秒),因前者控制子进程超时,后者控制HTTP请求超时,二者作用域不同且默认均为300秒,弱网环境下需协同调高。

项目级 config 里设 process-timeout 和 http.timeout
每个项目的 composer.json 都能独立控制超时,不需要全局污染。直接在顶层 "config" 段写死两个关键值:
-
process-timeout:管git clone、unzip、脚本执行等子进程,建议设为1200(20 分钟)或更高 -
http.timeout:管下载packages.json、ZIP 包等 HTTP 请求,建议同步设为600(10 分钟)
示例片段:
{
"config": {
"process-timeout": 1200,
"http.timeout": 600
}
}改完后运行 composer install 即生效,且该配置可提交进 Git,团队成员拉代码后自动复现。
为什么不能只改一个?
常见错误是只调高 process-timeout,结果卡在 Downloading https://... 就失败——这阶段根本没进子进程,只走 HTTP 层,完全不看 process-timeout。
- HTTP 卡住:错误含
cURL error 28或反复 retry,只响应http.timeout - 子进程卡住:错误含
The process "" exceeded the timeout,只响应process-timeout - 两者默认都是
300秒,弱网+大包下必然双杀
PHP 的 default_socket_timeout 也得同步检查,用 php -i | grep default_socket_timeout 查,若低于你设的 http.timeout,连接会被 PHP 提前掐断。
CI/CD 中用环境变量兜底最稳
项目级配置可能被 CI 环境覆盖,尤其 Docker 容器或 GitHub Actions 默认 PHP 配置较激进。此时环境变量优先级最高:
-
COMPOSER_PROCESS_TIMEOUT=1800:覆盖process-timeout -
COMPOSER_HTTP_TIMEOUT=1200:覆盖http.timeout
GitHub Actions 示例:
- name: Install dependencies
run: composer install --no-interaction
env:
COMPOSER_PROCESS_TIMEOUT: 1800
COMPOSER_HTTP_TIMEOUT: 1200注意:COMPOSER_HTTP_TIMEOUT 在 Composer 2.2+ 才支持;旧版本只能靠 http.timeout 配置项。
别忽略 vendor 目录和 autoload 生成阶段
有些“超时”根本不是网络问题:比如 composer install 卡在 Generating autoload files 后不动,其实是 PHP 递归扫描大量文件导致 I/O 阻塞或内存耗尽。
- 检查
memory_limit是否 ≥1.5G(php -i | grep memory_limit) - 确认
vendor/下无深层 symlink 或嵌套过深的包 - 这类卡顿不会报 timeout 错误,但表现一模一样——先排除资源瓶颈,再调 timeout
真正麻烦的是多项目共用同一份全局配置又混用私有 VCS 源,这时 timeout 只是表象,根源常在镜像兼容性或 SSH 代理配置上。


















