必须同时调高http.timeout和process-timeout:前者控制HTTP下载(如拉packages.json、ZIP包),默认300秒,弱网下需设600或1200,并同步调高PHP default_socket_timeout;后者控制git clone、unzip等子进程,默认300秒,建议设1200~1800。

http.timeout 和 process-timeout 必须同时调,只改一个基本没用。
卡在 Downloading https:// 时该调 http.timeout
这是 HTTP 请求阶段卡住,比如拉 packages.json、下载 ZIP 包,错误里常带 cURL error 28 或反复 retry 后失败。它完全不看 process-timeout,只认 http.timeout(Composer 2.x)。
- 项目级最稳:
composer config http.timeout 600,写入当前composer.json的config段,可提交、可复现 - 全局生效:
composer config -g http.timeout 600,写入~/.composer/config.json - 临时覆盖(CI 最常用):
COMPOSER_HTTP_TIMEOUT=1200 composer install -
关键坑:PHP CLI 的
default_socket_timeout若低于你设的http.timeout(常见值是 60),会提前掐断连接——必须同步查并调高:php -i | grep default_socket_timeout,再用php -d default_socket_timeout=600 composer install验证
报 “The process timed out” 错误该调 process-timeout
这是子进程执行太久被杀,比如 git clone、unzip、跑 post-install-cmd 脚本。错误里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 可看到最后那条命令。
- 全局改:
composer config -g process-timeout 1800(30 分钟),写入~/.composer/config.json - 项目级改:直接在
composer.json顶层加"config": {"process-timeout": 1200} - 临时覆盖:
COMPOSER_PROCESS_TIMEOUT=2000 composer install或composer install --process-timeout=2000(注意等号不能少) -
关键坑:设为
0表示禁用超时,但可能卡死无响应;调试建议先设600,确认能走通再调高
换镜像源和清缓存比调 timeout 更有效
很多“超时”本质不是时间问题,而是根本连不上官方源——国内直连 packagist.org 常因 DNS 污染、TLS 握手慢或路由抖动卡在第一步。
- 推荐阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠不能少) - 验证是否生效:
composer config -g repo.packagist输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} -
关键坑:换源后必须执行
composer clear-cache,否则旧缓存仍会复用失败地址;还要检查项目级composer.json是否硬写了repositories,它的优先级高于全局配置
代理配置错一个字段就等于没配
只配 http-proxy 一定失败,因为所有包仓库(Packagist、GitHub)都走 HTTPS,必须同时配 https-proxy,且值协议头必须是 http://。
- 正确写法:
composer config -g http-proxy http://127.0.0.1:7890和composer config -g https-proxy 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",两行都得有 -
关键坑:填
https://127.0.0.1:8080或127.0.0.1:8080都非法,会静默失效;NTLM 代理(如公司域环境)必须用 cntlm/px 中转,Composer 原生不支持
真正卡住时,别只盯着 timeout —— 它只是表象。DNS 解析失败、IPv6 fallback 拖延、PHP 内存不足(memory_limit )、甚至 vendor/ 下 symlink 过多导致 autoload 扫描阻塞,都可能伪装成超时。先用 ping packagist.org 和 curl -I https://packagist.org 快速定位链路哪一层断了,再动手改配置。











