卡在Downloading https://时应调http.timeout,它控制DNS解析、TLS握手、首字节等待及整个ZIP包传输的总时长,错误常为cURL error 28;同时必须同步调高PHP的default_socket_timeout和process-timeout,三者缺一不可。

卡在 Downloading https:// 时该调 http.timeout
这是 HTTP 请求全链路超时,包括 DNS 解析、TLS 握手、首字节等待、整个 ZIP 包传输——只要加起来超了就失败。错误里常见 cURL error 28 或反复 retry 后中断,和 process-timeout 完全无关。
必须同步调高 PHP 底层的 default_socket_timeout,否则哪怕你设了 http.timeout=1200,只要 CLI 的 default_socket_timeout=60(默认值),cURL 就会在 60 秒强制断连。
- 查当前值:
php -i | grep default_socket_timeout - 临时改(推荐 CI):
php -d default_socket_timeout=1200 composer install - 项目级固化(可提交):
composer config http.timeout 600,写入当前composer.json的config段 - 全局生效:
composer config -g http.timeout 600,写入~/.composer/config.json
The process timed out 错误该调 process-timeout
这和下载无关,是子进程执行太久被杀:比如 git clone、unzip、跑 post-install-cmd 脚本。错误里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 能看到最后执行的那条命令。
-
process-timeout默认仅 300 秒,和 HTTP 阶段完全解耦 - 项目级改法:直接在
composer.json顶层加"config": {"process-timeout": 1200} - 临时覆盖优先级最高:
COMPOSER_PROCESS_TIMEOUT=1800 composer install或--process-timeout=1800 - 设为
0表示禁用超时,但可能卡死无响应;调试建议先设600,确认流程能走通再调高
国内用户不换源,光调 timeout 基本没用
很多“超时”本质是根本连不上 packagist.org,DNS 污染、连接重置、TLS 握手失败,这些不会报明确 timeout,只会表现为反复 retry 或直接失败。
- 阿里云镜像是目前最稳定可用的国内源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 务必禁用 fallback,防止 Composer 自动回退到官方源拖慢整条链路:
composer config -g repo.packagist false - 验证是否生效:
composer config -g repo.packagist应输出对应 URL
弱网下真正容易被忽略的三重关卡
HTTP 下载、解压/克隆、脚本执行是三个独立阶段,各自有超时机制,且互不影响。只调一个参数,大概率在下一环节又卡住。
-
http.timeout管下载(DNS + TLS + body) -
process-timeout管外部命令(git、unzip、php脚本) -
default_socket_timeout是 PHP 底层兜底,低于前两者就白配
弱网环境里,这三个值得一起看、一起调,缺一不可。


















