应调process-timeout,因macOS上卡住多为git clone、unzip等子进程超时,而非HTTP下载;http.timeout仅控制DNS解析、TLS握手及HTTP传输,默认300秒,而process-timeout才管控外部命令执行时限。

MacOS 上设置 Composer timeout 本质是改 process-timeout,不是 http.timeout —— 因为卡住的几乎都是 git clone、unzip 或脚本执行这类子进程,不是 HTTP 下载本身。
为什么改 http.timeout 通常没用
你在终端看到 Downloading https://mirrors.aliyun.com/... 后卡住?那确实是 http.timeout 的事。但绝大多数 macOS 用户实际遇到的是:命令行光标不动、几秒后直接报 [RuntimeException] The process "git clone ..." exceeded the timeout。这说明 Composer 已完成下载,正卡在解压或拉 Git 仓库——此时 http.timeout 完全不生效,只有 process-timeout 管用。
-
http.timeout控制 DNS 解析 + TLS 握手 + 整个 HTTP body 传输,单位秒,默认 300 -
process-timeout控制每个外部命令(如git、unzip、php脚本)的最大运行时间,默认也是 300,但不可写进composer.json - macOS 上
git clone卡住还常因 SSH 配置或系统级网络策略,process-timeout是第一道兜底
全局设置 process-timeout(推荐)
运行这条命令即可永久生效(写入 ~/.composer/config.json):
composer config -g process-timeout 1200
注意:1200 是 20 分钟,比默认 300 更稳妥;设为 0 表示禁用超时,但不建议长期使用——万一镜像源彻底不可达,命令会无限挂起。
- 验证是否写入成功:
composer config -g process-timeout应输出1200 - 如果已存在旧配置,该命令会覆盖,无需手动编辑 JSON 文件
- 重启终端或新 shell 窗口后立即生效,无需重装 Composer
临时覆盖(CI/调试/单次救急)
加环境变量优先级最高,适合 GitHub Actions 或你只跑一次 composer install:
COMPOSER_PROCESS_TIMEOUT=1200 composer install
或者用命令行参数(Composer 2.2+ 支持):
composer install --timeout=1200
- 必须带等号,
--timeout 1200(无等号)会被静默忽略 - 该参数只对当前命令有效,不影响后续任何操作
- 若同时设了环境变量和
--timeout,以--timeout为准
别漏掉的 macOS 特定坑
macOS 上有些超时根本不是 Composer 配置问题,而是系统层或网络策略导致:
- 企业网/学校 Wi-Fi 常屏蔽
github.com或packagist.org,换手机热点一试便知 - WSL2 用户容易误以为是 macOS 问题,其实容器里没继承宿主机 DNS 和代理,得单独配
/etc/resolv.conf - 用了自定义
git协议(如git@github.com:),而 SSH key 没加载或 agent 没启动,git clone会卡在密码提示——此时process-timeout到期就报错,但根源是认证失败 - PHP CLI 的
memory_limit过低(如默认 128M),composer update解析锁文件阶段可能 OOM,表现和超时完全一样;查php -i | grep memory_limit,建议设为-1或2G
真正卡住时,先 composer install -vvv 看最后一条执行的命令是什么,再决定调哪个 timeout —— 不是所有“超时”都该加时间。


















