卡在Downloading https://时应调http.timeout,它控制DNS解析、TLS握手、首字节等待及整个body传输,默认300秒;子进程超时则需同步调process-timeout,二者缺一不可。

超时不是随机失败,而是两个独立超时机制在不同阶段各自触发的结果:HTTP 请求卡住是 http.timeout 不够,子进程 hang 住是 process-timeout 不够——配错一个,问题照旧。
卡在 Downloading https:// 时该调哪个 timeout
这是 HTTP 下载阶段卡住,比如拉 packages.json、解压 ZIP 包、下载 dist 归档。错误里常带 cURL error 28 或反复 retry 后失败,和 process-timeout 完全无关。
-
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 调试 - ⚠️ 关键前提:PHP 的
default_socket_timeout必须 ≥ 你设的http.timeout,否则会被提前掐断。查法:php -i | grep default_socket_timeout,常见值是 60,务必同步调高
The process timed out 错误该调哪个 timeout
这是子进程执行太久被杀,比如 git clone、unzip、跑 post-install-cmd 脚本。错误里一定含 [RuntimeException] The process "" exceeded the timeout,加 -vvv 可看到最后那条命令。
-
process-timeout控制单个外部命令最大执行时间,单位秒,默认 300,和 HTTP 完全无关 - 全局改:运行
composer config -g process-timeout 1800(30 分钟),写入~/.composer/config.json - 项目级改:直接在
composer.json顶层加"config": {"process-timeout": 1200} - 临时覆盖:用
COMPOSER_PROCESS_TIMEOUT=1800 composer install或命令行参数--process-timeout=1800 - ⚠️ 设为 0 表示禁用超时,但可能卡死无响应;调试建议先设 600,确认能走通再调高
镜像没生效?先验证 repos.packagist 而不是 repo.packagist
很多人以为配了镜像就万事大吉,结果还是连官方源。根本原因:拼写错误或配置未落地。
- 必须运行
composer config -g repos.packagist(注意是repos,不是repo),输出应为https://mirrors.aliyun.com/composer/ - 若为空、报错或显示其他地址,说明配置失败;检查
~/.composer/config.json中repositories字段是否正确写入 - 项目根目录的
composer.json若含repositories段,它会覆盖全局配置;此时要么删掉该段,要么用composer config repo.packagist composer https://mirrors.aliyun.com/composer/改项目级 - 换镜像后仍卡在 “Downloading … retrying …”?立刻清三样:
composer clear-cache、php -m | grep openssl(确认 OpenSSL 扩展启用)、CI 环境中需显式写进部署脚本(如 GitHub Actions 的run:步骤)
代理配置失效的典型表现与验证方式
Composer 卡在 Loading composer repositories,大概率不是网络慢,而是 https-proxy 根本没配——只配 http-proxy 对 Packagist 完全无效。
- Packagist 全走 HTTPS,必须同时设置
http-proxy和https-proxy,且都以http://开头(填https://或裸地址都会失效) - 必须加
-g写入全局配置,否则只在当前目录生效,换项目就“失忆” - 密码含
@、/、:要 URL 编码,例如pa@ss/word→pa%40ss%2Fword,可用php -r "echo rawurlencode('pa@ss/word');"生成 - 别信
composer diagnose,它只测packagist.org的 HTTP 端口,不走你配的https-proxy;真正验证方式是:curl -x http://127.0.0.1:8080 -I https://packagist.org/packages.json,返回HTTP/1.1 200 OK才算通
真正容易被忽略的是:两个 timeout 参数必须协同调整,且 PHP 底层 socket 设置必须兜底;镜像地址拼错一个字母、代理密码少 URL 编码一个字符、CI 脚本漏掉全局配置命令——这些细节比超时值本身更能决定成败。











