Composer超时需分三类处理:DNS解析超时(卡在“Resolving dependencies”)、HTTP下载超时(卡在“Downloading https://…”)、子进程执行超时(报“The process ‘xxx’ exceeded the timeout”),各自独立,须精准定位并分别调整对应参数。

Composer 报超时,不是改一个 timeout 就能解决的——它有至少三个互不干扰的超时机制,分别管 DNS 解析、HTTP 下载、子进程执行。错配任何一个,都会卡在不同阶段,且错误提示高度相似。
卡在 “Resolving dependencies” 是 DNS 问题,不是 timeout 能修的
这个阶段 Composer 只做域名解析(比如查 mirrors.aliyun.com 的 IP),不发 HTTP 请求,也不读 http.timeout 或任何代理配置。调高所有 timeout 都无效。
- 先验证 DNS 是否通:
dig mirrors.aliyun.com @8.8.8.8,看是否返回 IPv4 地址 - 检查
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows),确认没把镜像域名指向127.0.0.1 - 临时切手机热点测试——很多企业网会屏蔽
packagist.org域名,但热点直连通常通畅 - 别碰
composer config里的超时项,这一步根本没走到网络请求
卡在 “Downloading https://…” 才该动 http-basic-timeout
这时 Composer 真正发起 HTTPS 请求拉取 packages.json 或 ZIP 包,http-basic-timeout(Composer 2.2+)或旧版的 http.timeout 才起作用。
-
http-basic-timeout控制单次请求总耗时(DNS + TLS 握手 + 首字节等待 + body 传输),默认仅 60 秒,弱网下极易触发cURL error 28 - 全局设高:
composer config -g http-basic-timeout 300(推荐 300 秒) - 项目级更稳妥:
"config": {"http-basic-timeout": 300}写进composer.json,可提交、可复现 - 注意 PHP 底层限制:
php -i | grep default_socket_timeout若输出值小于你设的http-basic-timeout(常见为 60),连接会被 PHP 提前掐断,需同步调高
报 “The process ‘xxx’ exceeded the timeout” 必须调 process-timeout
这是子进程(如 git clone、unzip、php artisan)执行太久被 Composer 主进程杀掉,和网络下载无关,--timeout 或 http-basic-timeout 完全不生效。
- 错误里带
The process "" exceeded the timeout就是它,不是网络问题 - 默认 300 秒,含私有 Git 包或大 dist 包时极易超;建议设为
1200(20 分钟)或1800(30 分钟) - 项目级:
composer config process-timeout 1200(写入当前composer.json) - 全局级:
composer config -g process-timeout 900(写入~/.composer/config.json) - 命令行临时覆盖:
composer install --timeout=1200(注意必须带等号,--timeout 1200会被静默忽略)
代理环境下必须同时配 http-proxy 和 https-proxy
Composer 对 HTTP 和 HTTPS 请求走两套完全独立的代理路由。所有包仓库(packagist.org、镜像源、GitHub API)都走 HTTPS,只配 http-proxy 会导致 HTTPS 请求静默 fallback 到直连,结果就是卡在 Loading composer repositories 或反复报 cURL error 28。
-
https-proxy的值协议头必须是http://,哪怕代理服务监听 HTTPS 端口,例如:http://127.0.0.1:7890 - 密码含
@或/必须 URL 编码:http://user:pa%40ss%2Fword@127.0.0.1:8080 - 验证是否生效:
composer config -g --list | grep -E "(http|https)-proxy",必须看到两行且格式合规 - 代理配好后仍超时?大概率是
http-basic-timeout和process-timeout还没同步调高
最常被忽略的是:每个超时参数只管自己那一段,它们之间没有继承或叠加关系。卡在哪一环,就得动对应那个参数,而不是无差别地把所有 timeout 都设成 0。


















