卡在Resolving dependencies是DNS解析失败,非超时问题,需用dig/nslookup验证并更换DNS或修改hosts;卡在Downloading才调http.timeout;卡在Executing command才调process-timeout。

直接调 process-timeout 或 http.timeout 不一定管用——得先看 -vvv 输出最后一行卡在哪,否则改错参数只会白等。
卡在 Resolving dependencies 怎么办
这不是超时问题,是 DNS 解析失败或 Packagist 域名不通。Composer 根本还没发 HTTP 请求,http.timeout 和 process-timeout 都不生效。
- 运行
dig packagist.org或nslookup packagist.org确认 DNS 是否返回 IP - 临时换 DNS 测试:比如
echo "nameserver 114.114.114.114" | sudo tee /etc/resolv.conf - 若公司网络限制境外域名,必须配代理或走镜像源(但注意:镜像源对
Resolving dependencies阶段无效,它查的是packagist.org的元数据地址)
卡在 Downloading https:// 该调哪个 timeout
这是 HTTP 层卡住,典型表现是反复 retry、cURL error 28、或日志里出现 GET https://mirrors.aliyun.com/composer/packs/xxx.json 后长时间无响应。此时只认 http.timeout(Composer 2.x)或 http-basic-timeout(2.2+)。
-
http.timeout控制整个 HTTPS 请求周期(DNS + TLS 握手 + 首字节等待 + body 下载),默认仅 60 秒;弱网或大包建议设为600 -
http-basic-timeout是更细粒度的 GET 超时(仅管连接和读取头几 KB),Composer ≥ 2.2 才支持,建议设为300 - PHP 底层会提前掐断:运行
php -i | grep default_socket_timeout,若输出是60,即使你设了http.timeout 600也无效,必须同步调高 PHP 的default_socket_timeout
卡在 Executing command (CWD: ...) 怎么调
这是子进程执行超时,比如 git clone、unzip、tar -xzf 或自定义脚本卡死。错误里一定含 [RuntimeException] The process "" exceeded the timeout,此时才轮到 process-timeout。
-
process-timeout控制单个外部命令最大执行时间,默认 300 秒;解压几百 MB 的 dist 包或跑复杂 post-install-cmd 时容易触发,建议设为1200~1800 - 环境变量
COMPOSER_PROCESS_TIMEOUT优先级高于命令行参数,CI 中更可靠 - 注意:私有 Git 包每次
git checkout都计入总耗时,不是独立计时——所以大量私有包项目要设更高值 - 如果调高后仍失败,大概率是内存不足:检查
php -r "echo ini_get('memory_limit');",composer update阶段建议 ≥ 1.5G
怎么验证 timeout 设置真生效了
别信“我写进去了”,得动手验证。Composer 静默忽略拼错字段、字符串值、路径错位等所有错误,不报错也不提醒。
- 查配置是否写入:运行
composer config -g http.timeout或composer config process-timeout,有数字输出才算成功;无输出=还在用默认值 - 打开对应 JSON 文件确认:
~/.composer/config.json(全局)或项目下composer.json的"config"段,字段名必须是"http-basic-timeout"(连字符!不是下划线),值必须是整数600,不能是"600" - 观察
-vvv日志开头:若看到Running update with --timeout=1200,说明命令行参数生效;但注意这个--timeout是旧版别名,新版已弃用,实际起作用的是process-timeout - 最硬核验证:用
curl -I https://mirrors.aliyun.com/composer/和php -i | grep default_socket_timeout排除底层干扰——很多“超时”根本不是 Composer 的锅
最容易被忽略的点:CI 环境里,timeout 命令、Docker --stop-timeout、Runner 自身的 job 超时,都会在 Composer 感知不到的情况下直接 kill 进程。这时候调再高的 process-timeout 也没用。











