卡在Downloading https://或unzip阶段需同时调整http.timeout(设1200,控HTTPS全周期)、process-timeout(设1800,控unzip等子进程)和http-basic-timeout(设300,控单次GET),并确保PHP default_socket_timeout≥1200以防底层中断。

卡在Downloading https:// 或 unzip 阶段该调哪个参数
不是只改 process-timeout 就够用,也不是只改 http.timeout 就能解决。下载解压超时是两层问题叠加:HTTP 传输阶段 + 后续解压/克隆子进程阶段,必须同时干预。
常见错误现象包括:
-
cURL error 28或反复 retry 后失败 → HTTP 阶段卡住,看http.timeout和http-basic-timeout - 卡在
unzip、git clone、tar -xzf→ 子进程阶段卡住,看process-timeout - 明明设了 1200 秒还报超时 → PHP 底层
default_socket_timeout是 60 秒,提前掐断连接
三个关键 timeout 参数怎么设才有效
Composer 2.x 起真正起效的只有三个独立参数,互不影响,也不能混用:
-
http.timeout:控制整个 HTTPS 请求生命周期(DNS、TLS、首字节、body 传输),默认 300 秒。弱网拉大 ZIP 包建议设为1200;但注意它不能写进composer.json的config段 —— 这个配置项已被废弃多年 -
process-timeout:控制unzip、git clone等外部命令执行上限,默认 300 秒。解压几百 MB 的 dist 包建议设为1800;可写入项目或全局composer.json的config段 -
http-basic-timeout(Composer 2.2+):只管单次 HTTP GET 的连接和读取(比如拉某个 ZIP 的头几 KB),不涉及整个 body 下载,适合设为300防止握手慢中断;也可写入config段
错误示范:"config": { "timeout": 1200 } —— timeout 字段 Composer 根本不认。
项目级、全局、临时三种生效方式怎么选
优先级从高到低:环境变量 > 项目配置 > 全局配置。按需组合使用:
- 项目级(推荐用于团队协作):
composer config http.timeout 1200composer config process-timeout 1800composer config http-basic-timeout 300
→ 写入当前composer.json的config段,可提交、可复现 - 全局(推荐 CI/CD 或本地开发统一策略):
composer config -g process-timeout 1800composer config -g http-basic-timeout 300
→ 写入~/.composer/config.json,http.timeout无法全局设置,只能靠环境变量 - 临时覆盖(调试最稳):
COMPOSER_HTTP_TIMEOUT=1200 COMPOSER_PROCESS_TIMEOUT=2000 composer install
→ 不修改任何配置文件,适合 CI 流水线快速绕过
别忘了 PHP 底层 socket 超时这个隐藏开关
即使你把 http.timeout 设成 1200,如果 PHP CLI 的 default_socket_timeout 是默认的 60 秒,cURL 在底层仍会在 60 秒后直接报错 —— 这是很多用户调了半天没效果的根本原因。
检查并同步调整:
- 查当前值:
php -i | grep default_socket_timeout - 临时改(CLI 环境):
php -d default_socket_timeout=1200 composer install - 永久改(推荐):编辑
php.ini中的default_socket_timeout = 1200,然后重启 CLI 环境
这个值必须 ≥ 你设的 http.timeout,否则前面所有配置都白调。


















