timeout不是Composer支持的config项,写了无效;process-timeout只控制git clone、unzip等子进程,不控制HTTP下载;HTTP下载卡住(如Downloading https://)必须调http.timeout,它管控DNS、TLS、首字节及body传输全过程,默认300秒,弱网下需提高至600或更高,并同步调高PHP的default_socket_timeout。

composer.json 里配 timeout 或 process-timeout 没用?
直接说结论:timeout 根本不是 Composer 支持的 config 项,写了等于白写;process-timeout 虽然能配,但它只管 git clone、unzip 这类子进程,不管 HTTP 下载。很多人卡在 Downloading https://... 却去改 process-timeout,完全对不上症。
http.timeout 才是下载卡住时真正该调的参数
HTTP 请求阶段(拉 packages.json、下 ZIP 包)超时,错误里常带 cURL error 28 或反复 retry 后失败,这时必须调 http.timeout。它控制 DNS 解析 + TLS 握手 + 首字节等待 + 整个 body 传输的总时间,单位秒,默认仅 300(5 分钟),弱网下极易触发。
- 项目级生效(推荐,可提交):
composer config http.timeout 600 - 全局生效(开发机常用):
composer config -g http.timeout 600 - 临时覆盖(CI 调试首选):
COMPOSER_HTTP_TIMEOUT=1200 composer install - ⚠️ 注意:
php -i | grep default_socket_timeout查出的 PHP CLIdefault_socket_timeout若低于你设的http.timeout(常见值是 60),连接会被 PHP 层提前掐断,务必同步调高
为什么换源后还超时?镜像配置可能根本没生效
国内用户不配镜像,调再大 http.timeout 也没用。但镜像配置极易静默失效——键名、type 值、URL 格式三者错一个,Composer 就当没看见,仍走官方源。
- 唯一可靠写法:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ -
repo.packagist是固定键名,不能写成repos.packagist或repositories.packagist -
composer是强制 type 值,必须显式写出 - URL 必须以
https://开头,且末尾带/,否则部分版本返回 404 - 验证是否生效:
composer config -g repo.packagist应输出完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
别只盯着 timeout,process-timeout 也得同步调
HTTP 下载完之后,解压、生成 autoload、跑 post-install-cmd 脚本这些步骤,由 process-timeout 控制。它和 http.timeout 完全无关,但默认也是 300 秒,大项目或 CI 环境很容易被杀。
- CI/CD 推荐设为 1800:
composer config -g process-timeout 1800 - 开发机够用就行,设 600 即可:
composer config process-timeout 600 - 环境变量优先级最高:
COMPOSER_PROCESS_TIMEOUT=1800 composer install - 设为 0 表示禁用超时,但有卡死风险,调试时先试 600,确认流程走通再调高
curl -I https://mirrors.aliyun.com/composer/packages.json 验证镜像连通性,再决定哪一层 timeout 该加、加多少。


















