必须同时调高http.timeout(控制DNS/TLS/首字节/body下载,默认仅60秒)和process-timeout(控制git clone/unzip等子进程,默认300秒),并同步提升PHP的default_socket_timeout,否则底层会提前掐断连接。

为什么改了 timeout 还是超时?
因为 Composer 有两个独立超时参数,http.timeout 和 process-timeout,改错或只改一个就白费功夫。前者管 HTTP 下载(DNS、TLS、首字节、body),后者管 git clone、unzip、脚本执行等子进程。错误里带 cURL error 28 或 Downloading https:// 就该调 http.timeout;报 The process "" exceeded the timeout 才动 process-timeout。
-
http.timeout默认约 60 秒(不是 300),国内 DNS 慢或 TLS 握手卡顿极易触发 -
process-timeout默认 300 秒,但大项目解压 vendor 或跑 post-install-cmd 很容易突破 - PHP 的
default_socket_timeout(用php -i | grep default_socket_timeout查)若低于你设的http.timeout,会提前掐断连接,必须同步调高
怎么安全地改 http.timeout?
别直接改全局配置再祈祷生效——先确认当前值:composer config -g http.timeout。输出为空?说明没设过,默认就是危险的低值。推荐按优先级顺序操作:
- 项目级最稳:
composer config http.timeout 600,写入当前composer.json的config段,可提交、CI 可复现 - 全局生效:
composer config -g http.timeout 600,写入~/.composer/config.json(Windows 是%USERPROFILE%\AppData\Roaming\Composer\config.json) - 临时覆盖(CI 调试首选):
COMPOSER_HTTP_TIMEOUT=1200 composer install,优先级最高 - 别碰
http-basic-timeout:Composer v2 完全不读这个,v1 已废弃
process-timeout 改多少合适?
设为 0 禁用超时风险太大,进程可能卡死无响应。建议从 600(10 分钟)起步,能走通再逐步加:
- 项目级:
composer.json顶层加"config": {"process-timeout": 1200} - 全局:
composer config -g process-timeout 1800(30 分钟) - 命令行临时:
composer install --process-timeout=1800或COMPOSER_PROCESS_TIMEOUT=1800 composer install - 若用 CI/CD,必须显式设环境变量,容器重启后全局 config 会丢失
镜像没配对,timeout 再大也没用
很多“超时”本质是根本连不上源——比如 repo.packagist 键名写成 repos.packagist,或者 URL 少了末尾斜杠:https://mirrors.aliyun.com/composer ❌ → https://mirrors.aliyun.com/composer/ ✅。验证是否真生效:
- 运行
composer config -g repo.packagist,输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 删掉现有
vendor/和composer.lock,再composer install -v,看日志里请求的是不是镜像域名 - 卡在
Resolving dependencies阶段?那不是 timeout 问题,是 DNS 解析失败,dig mirrors.aliyun.com直接测
真正难搞的不是 timeout 数值本身,而是它和 DNS、TLS、镜像 URL 格式、PHP socket 设置之间层层嵌套的依赖关系。调参前务必先确认哪一环真正卡住,否则只是把失败拖得更久。


















