必须同时调高http.timeout和process-timeout——前者控制DNS、TLS、首字节及body传输总时长(默认300秒),卡在Downloading时需调;后者控制git clone、unzip等子进程执行时限(默认300秒),卡在Executing command时需调;二者缺一不可,且须同步调高PHP的default_socket_timeout以防底层中断。

必须同时调高 http.timeout 和 process-timeout,只改一个大概率还是卡住。
卡在 Downloading https:// 时该调 http.timeout
这是 HTTP 请求阶段卡住,比如拉 packages.json、下载 ZIP 包,错误里常带 cURL error 28 或反复 retry 后失败。它不看 process-timeout,只认 http.timeout(Composer 2.x)。
-
http.timeout控制 DNS 解析 + TLS 握手 + 首字节等待 + 整个 body 传输的总时间,单位秒,默认仅 300(5 分钟),弱网下极易触发 - 项目级最稳:运行
composer config http.timeout 600,写入当前composer.json的config段,可提交、可复现 - 全局生效:用
composer config -g http.timeout 600,写入~/.composer/config.json - 临时覆盖优先级最高:执行
COMPOSER_HTTP_TIMEOUT=1200 composer install,适合 CI 调试
卡在 Executing command(如 git clone)时该调 process-timeout
子模块(type: git、私有包、GitLab 仓库)不是走 HTTP 下载 ZIP,而是调用系统 git clone 或 unzip 命令,这类操作被归为“外部子进程”,http.timeout 完全不生效,必须靠 process-timeout 控制。
- 常见现象是日志停在:
Executing command (CWD: /path): git clone --no-checkout 'https://xxx.git' '/path/vendor/xxx',然后不动超过 5 分钟——这就是process-timeout触发了默认 300 秒限制 -
process-timeout是唯一能管住git clone、unzip、php artisan这类子进程的配置,单位秒,建议设为1200(20 分钟)起步 - 临时生效:加
--timeout=1200参数,如composer install --timeout=1200 - 永久生效:运行
composer config -g process-timeout 1200,写入全局配置 - 环境变量更优先:
COMPOSER_PROCESS_TIMEOUT=1200会覆盖所有配置项,CI 中推荐用这个
别忘了 PHP 底层 default_socket_timeout 这个隐形天花板
就算你把 http.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 版本的
php.ini(如宝塔里是/www/server/php/82/etc/php.ini),搜default_socket_timeout,改成600,然后重启 PHP - 注意:宝塔面板中
composer默认用系统 PHP(/usr/bin/php),不是你网站设置的版本,务必确认改的是同一个 PHP 的php.ini
换国内镜像只是辅助,不能替代超时配置
阿里云镜像是目前最稳定可用的国内源,但镜像只加速 Packagist 公共包的 dist ZIP 下载,对 type: git、type: svn、type: path 这类 VCS 依赖完全不代理——它们仍直连 GitHub/GitLab/自建 Git 服务器。
- 设镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 禁用 fallback:
composer config -g repo.packagist false(防止 Composer 自动回退到官方源拖慢流程) - 验证是否生效:
composer config -g repo.packagist应输出对应 URL - 若项目含私有 Git 仓库,
process-timeout仍是关键,且要确保git clone在终端能手动跑通
真正难的不是写进配置,而是确认它在对的时机、被对的组件读取。最可靠的验证方式是加 -vvv 看日志,而不是只看 composer config 输出。


















