应修改process-timeout配置,因其控制git clone、unzip等子进程超时,默认300秒易触发“The process "" exceeded the timeout”错误;建议全局设为1800、项目级设为1200,禁用超时(0)不推荐。

不能彻底杜绝超时报警,但能消除 99% 的误报和假性超时——关键在分层控制、参数对齐、代理合规。
process-timeout 控制子进程,不是 HTTP 请求
报 The process "" exceeded the timeout 说明是 git clone、unzip 或自定义脚本卡住了,跟网络下载无关。默认 300 秒在 CI 或私有 GitLab 上根本不够。
- 全局设为 1800(30 分钟):运行
composer config -g process-timeout 1800 - 项目级固化更稳妥:在
composer.json的config段加"process-timeout": 1200,提交进版本库 - 绝对不要设为 0:一旦远程仓库假死或磁盘满,Composer 会无限挂起,CI 流水线卡死无日志
- 临时调试可用
--timeout=1200(注意等号),优先级最高,但不解决重复问题
http.timeout 控制 DNS+TLS+下载全程,必须同步调 PHP 底层
卡在 Downloading https://... 或反复报 cURL error 28,是 HTTP 层超时。它管的是从 DNS 解析到 body 传完的总耗时,默认 300 秒,弱网下极易击穿。
- 先查 PHP 底层限制:
php -i | grep default_socket_timeout,常见值是 60 —— 如果低于你设的http.timeout,PHP 会提前掐断,白配 - 全局设
http.timeout:运行composer config -g http.timeout 600 - 临时覆盖最准:
COMPOSER_HTTP_TIMEOUT=1200 composer install - 别漏掉环境变量写法:某些 CI 镜像(如 GitHub Actions 的 ubuntu-latest)默认没加载 Composer 全局配置,必须显式传环境变量
代理配置错一个字段,HTTPS 就静默直连
只配 http-proxy 一定失败。Packagist、GitHub、GitLab 所有仓库全走 HTTPS,Composer 对 HTTP/HTTPS 请求走两套路由:https-proxy 必须存在,且协议头必须是 http://,哪怕你的代理监听的是 HTTPS 端口。
- 正确写法:
http://127.0.0.1:7890(Clash)、http://user:pa%40ss%2Fword@127.0.0.1:8080(含特殊字符需 URL 编码) - 错误写法:
https://127.0.0.1:7890、127.0.0.1:7890—— 这两种会静默失效,现象是Loading composer repositories卡住或报cURL error 28 - 验证是否生效:
composer config -g --list | grep -E "(http|https)-proxy",必须两行都存在且格式合规 - NTLM 代理(如公司 Windows 域)必须用
cntlm或px中转,Composer 原生不支持;中转端口设为http://127.0.0.1:3128,再统一配给http-proxy和https-proxy
脚本超时归 PHP 管,不是 Composer 配置项
报 Maximum execution time of XXX seconds exceeded 或脚本中途退出,说明是 post-install-cmd 这类 PHP 脚本被 PHP 自身 kill 了。你在 composer.json 里加 "timeout": 0 完全无效。
- 临时方案:
php -d max_execution_time=0 composer install(0 表示不限制) - CI/CD 推荐写死:
php -d max_execution_time=900 composer install --no-interaction - 脚本内主动延长:
set_time_limit(0),但必须放在逻辑开头,否则可能被后续代码覆盖 - 检查是否卡在交互上:加上
--no-interaction,避免php artisan key:generate等命令等 stdin
真正难调的不是单个参数,而是参数之间的隐式依赖:比如 http.timeout 设了 1200,但 PHP 的 default_socket_timeout 是 60,那永远卡在 60 秒;又比如代理配了 http-proxy 却漏了 https-proxy,现象却是“没报错但就是不动”。这些细节不逐层验证,光调 timeout 数字毫无意义。


















