超时需分环节排查:Resolving dependencies 是 DNS 问题,Downloading 是单次 HTTP 请求超时(调 http.timeout),Executing command 是子进程挂起(调 process-timeout)。

超时不是配置没生效,是卡在了不同环节——Resolving dependencies 是 DNS 问题,Downloading 是单次 HTTP 请求卡住,Executing command 是子进程(比如 git clone)挂起,三者调的参数完全不同。
看最后一行输出,先定位卡在哪一步
运行 composer install -vvv 或 composer update -vvv,紧盯终端最后几行:
- 停在
Resolving dependencies:说明连域名都还没解析成功,http.timeout和process-timeout完全无效;立刻试dig packagist.org @114.114.114.114或换 DNS 到8.8.8.8 - 停在
Downloading https://mirrors.aliyun.com/composer/p2/laravel/framework.json:这是单次 HTTP 请求超时,必须调http.timeout(Composer v2)或http-basic-timeout(v2.2+),设为600最稳妥 - 停在
Executing command (CWD: /path)后不动:大概率是git clone或解压失败,此时要调process-timeout,建议设为1200,CI 环境还得加COMPOSER_PROCESS_TIMEOUT=1200环境变量
http.timeout 和 process-timeout 必须分开设
这两个值不互斥,且作用阶段完全不同:
-
http.timeout控制每次 HTTP 请求(含 TLS 握手、首字节等待、body 传输),默认仅 60 秒;国内镜像首字节延迟高时极易触发,必须设为300~600 -
process-timeout控制整个命令生命周期(含依赖解析、下载、解压、运行脚本、生成 autoload),默认 300 秒;大项目跑 post-install-cmd 或扫描 vendor 时容易超,建议1200 - 别用
--timeout=600代替 —— 它只等总时间,不保单次请求;而provider-*.json下载失败就是单请求中断,必须靠http.timeout
换源不生效?检查 URL 格式和缓存
换源命令看似成功,但实际没走镜像,常见于以下硬伤:
- URL 少了末尾斜杠:
https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(会拼出非法路径/composerpackages.json) - 键名写错:
repo.packagist是唯一合法键,写成repos.packagist或repositories都静默失效 - 没清缓存:
composer clear-cache必须执行,否则仍用旧地址重试 - 验证是否真生效:
composer config -g repo.packagist输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
CI/CD 环境里光调 timeout 不顶用
容器每次重启都会丢配置,且子进程(如插件调用的 unzip)不读命令行参数:
- 必须用环境变量固化:
COMPOSER_PROCESS_TIMEOUT=1200和COMPOSER_HTTP_TIMEOUT=600 - 强制用 dist 包:
--prefer-dist,避免git clone卡在 SSH 或代理上 - 禁用 packagist.org 回源:镜像配置后,若某包镜像没同步,Composer 默认会 fallback 到官方源,导致突然连不上;加
"packagist.org": false到repositories里彻底关闭 - 别信
--ignore-platform-reqs:它跳过 PHP 扩展检查,可能让后续构建失败,只在明确知道缺失不影响当前步骤时才加
最常被忽略的是:卡在 Generating autoload files 根本不是网络问题,而是 WSL2/NTFS/Docker for Mac 下 symlink 解析慢或 PHP 的 opcache.enable_cli=0 导致反复 stat 文件。这时候调 timeout 没有任何意义。











