应配置"process-timeout"(控制git clone等子进程)和"http.timeout"(控制HTTP下载),二者均须置于composer.json的config节点下,如{"config":{"process-timeout":1200,"http.timeout":600}},且值必须为整数、字段名严格区分大小写和符号。

composer.json 里怎么加 timeout 配置
不能直接写 "timeout": 600——这个字段根本不存在,Composer 会静默忽略。真正起作用的是两个独立字段:process-timeout(控制 git clone、unzip 等子进程)和 http.timeout(控制 HTTP 下载,如拉 packages.json 或 ZIP 包)。
-
process-timeout必须是整数,单位秒,写进composer.json的顶层"config"段,例如:{ "config": { "process-timeout": 1200 } } -
http.timeout同样要写在"config"下,且只在 Composer 2.x 生效,默认 300 秒:{ "config": { "http.timeout": 600 } } - 改完后别忘了运行
composer install或composer update触发实际行为;仅改 JSON 不会自动重载配置 - 若项目中同时有
repositories自定义源,http.timeout对它们也生效;但对git@类 VCS 源无效,那得靠process-timeout
为什么改了 composer.json 还不生效
常见原因不是配置没写对,而是被更高优先级的设置覆盖,或底层机制拦截了。
- 环境变量优先级最高:如果设置了
COMPOSER_PROCESS_TIMEOUT或COMPOSER_HTTP_TIMEOUT,它们会直接覆盖composer.json里的值 - PHP 底层超时会掐断连接:运行
php -i | grep default_socket_timeout,若输出是60,而你设了http.timeout为600,那 PHP 在 60 秒就断开了,Composer 设置形同虚设 - 字段名拼错很常见:
http-timeout❌、http_timeout❌、timeout❌;必须是http.timeout(英文点号)和process-timeout(英文连字符) - 值写成字符串也会被忽略:
"process-timeout": "1200"❌,必须是"process-timeout": 1200✅
验证配置是否真被读取
光看 composer.json 文件内容没用,得让 Composer 主动吐出来。
- 运行
composer config process-timeout—— 有数字输出(如1200)说明已加载;无输出说明仍用默认值300 - 同样,
composer config http.timeout查 HTTP 层配置;注意它在 Composer 2.2+ 才支持,旧版本查不到也不报错 - 加
-vvv运行命令,开头几行会显示类似Running update with --timeout=1200(仅当用了--timeout参数时),但更可靠的是观察卡点:如果卡在Downloading https://...,而http.timeout已设为600却仍在 30 秒中断,大概率是 PHP 的default_socket_timeout在作祟
CI/CD 中特别要注意什么
容器或 runner 环境下,配置容易“看起来写了,其实没生效”。
- Docker 容器里,
COMPOSER_HOME路径可能未挂载,导致composer config -g写入的全局配置丢失;应统一用项目级composer.json配置 + 环境变量兜底 - GitHub Actions 或 GitLab CI 中,建议显式设置:
COMPOSER_PROCESS_TIMEOUT: 1800和COMPOSER_HTTP_TIMEOUT: 1200,避免依赖 runner 默认 PHP 配置 - 某些 runner 本身带
timeout限制(如 GitHub Actions 默认 6 小时,但单个 job 可能更短),Composer 超时设置再大也救不了被系统 kill 的情况 - 若用了自定义脚本(如
post-install-cmd),它的执行时间由 PHP 的max_execution_time控制,和process-timeout无关——这时得用php -d max_execution_time=0 composer install


















