在composer.json的config节点下配置"process-timeout": 1200和"http-basic-timeout": 300(Composer 2.2+),二者均为整数、用连字符、不加引号,可实现单项目独立超时控制。

怎么在 composer.json 里配 process-timeout 和 http-basic-timeout
单个项目独立配置超时,唯一可靠方式是直接改 composer.json 的 config 节点。Composer 会优先读取项目级配置,不污染全局、不干扰其他项目,CI/CD 环境也自动继承。
必须写对字段名和格式:
-
process-timeout控制git clone、unzip、php -r "copy()"这类子进程,值设为1200(20 分钟)较稳妥 -
http-basic-timeout控制单次 HTTP 请求总耗时(DNS + TLS + 首字节 + body),Composer 2.2+ 才支持,设300(5 分钟)可覆盖默认的 60 秒 - 两个字段都必须是整数,不能加引号:
"process-timeout": 1200✅,"process-timeout": "1200"❌ - 字段名是连字符,不是下划线或驼峰:
http-basic-timeout✅,http_timeout或httpBasicTimeout❌,Composer 会静默忽略
示例片段:
{
"config": {
"process-timeout": 1200,
"http-basic-timeout": 300
}
}
用 composer config 命令写入比手改更安全吗
是的,推荐优先用命令行写入。它能自动校验 JSON 结构、避免拼写错误,并确保字段落在正确位置。
在项目根目录执行:
-
composer config process-timeout 1200→ 写入process-timeout -
composer config http-basic-timeout 300→ 写入http-basic-timeout - 执行后立刻打开
composer.json确认是否出现在config对象内,而不是顶层或其他嵌套位置 - 验证是否生效:
composer config process-timeout应输出1200;无输出说明没写对位置或格式错
注意:composer config 不会自动加 -g,只要不带 -g 就一定是项目级,不会误改全局。
为什么只配 process-timeout 还是卡在 downloading 阶段
因为 downloading 卡住通常不是子进程问题,而是单次 HTTP 请求超时——这归 http-basic-timeout 管,不是 process-timeout。
常见现象:
- 执行
composer install卡在Downloading https://mirrors.aliyun.com/composer/dists/xxx.zip - 报错
cURL error 28: Operation timed out after 60000 milliseconds(注意单位是毫秒,对应 60 秒) - 此时
process-timeout再大也没用,因为请求根本没完成就被 cURL 中断了 - Composer 2.1 及更早版本不识别
http-basic-timeout,只能靠--timeout=1800硬扛,或升级 Composer
验证方法:加 -vvv 看日志,确认失败前最后一条 HTTP 请求是否真被截断在 60 秒左右。
PHP 底层 socket 超时这个隐形限制必须同步调
就算你把 http-basic-timeout 设到 1200,如果 PHP 的 default_socket_timeout 是默认 60,Composer 还是会在 60 秒被掐断——这个值 Composer 完全不控制。
检查和修改方式:
- 查当前值:
php -i | grep default_socket_timeout - 临时改(当前终端有效):
php -d default_socket_timeout=600 /usr/bin/composer install - 永久改:编辑对应 PHP CLI 版本的
php.ini(比如宝塔里是/www/server/php/82/etc/php.ini),搜default_socket_timeout,改成600,然后重启 PHP - 特别注意:宝塔面板中 composer 默认调用系统 PHP(
/usr/bin/php),不是你网站设置的 PHP 版本,务必确认改的是同一个php.ini
真正起作用的不是“写进文件”,而是让 php -i 输出的值变掉,并且 composer install -vvv 日志里不再出现底层 socket 中断痕迹。











