必须同时设process-timeout和http-basic-timeout,因二者分别控制子进程执行总时长(如git clone、解压)和单次HTTPS请求连接+读取响应头时长(如下载包),阶段不同、不可替代;仅调其一仍会超时卡住。

直接改 process-timeout 和 http-basic-timeout 两个值,再换国内镜像源,基本能覆盖 95% 的超时场景。只调一个参数大概率还会卡住。
为什么必须同时设 process-timeout 和 http-basic-timeout
这两个超时控制的是完全不同的阶段,互不替代:
-
process-timeout控制子进程(如git clone、unzip)最大执行时间,默认 300 秒;卡在Cloning into 'xxx'...或解压大包时它才起作用 -
http-basic-timeout控制单次 HTTPS 请求的连接 + 首字节等待 + 响应头读取,默认仅 60 秒;卡在Downloading https://...或反复 retry 时,它才是关键 - Composer 2.2+ 才支持
http-basic-timeout;旧版本只能靠http.timeout(注意不是config.timeout,后者无效) - 设为 0 表示禁用超时,但不推荐——某些网络环境 TLS 握手失败后会无限重试,Ctrl+C 都杀不掉进程
怎么永久生效且避免被项目覆盖
全局配置写入 ~/.composer/config.json,但要注意优先级和字段名:
- 运行这两条命令(推荐值):
composer config -g process-timeout 1800composer config -g http-basic-timeout 300 - 别用
composer config -g http.timeout 600——这个字段在新版中已被弃用,实际读不到 - 如果项目
composer.json里有"config": { "process-timeout": 300 },它会覆盖全局值;检查并删掉这类冗余配置 - Windows 用户路径是
%USERPROFILE%\AppData\Roaming\Composer\config.json,可手动打开确认字段是否写入成功
代理和镜像必须同步配,否则 timeout 白调
只设超时却不解决链路问题,等于给一辆没油的车调高转速表——看着快了,其实动不了:
- 所有包仓库都走 HTTPS,所以必须同时设
http-proxy和https-proxy;只设前者,HTTPS 请求会静默直连,表现就是卡在Loading composer repositories -
https-proxy的值协议头必须是http://,哪怕你的代理监听的是 HTTPS 端口,例如:http://127.0.0.1:7890 - 国内用户优先换镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/;这比调 timeout 更治本 - 镜像地址末尾多一个
/会导致拼出https://mirrors.aliyun.com/composer//packages.json→ 404,检查composer config -g --list输出是否干净
最容易被忽略的是 PHP 底层的 default_socket_timeout:如果它低于你设的 http-basic-timeout(常见默认值是 60),socket 层会在 PHP 层之前就掐断连接。查它:php -i | grep default_socket_timeout,必要时在 php.ini 里同步调高。











