必须同时配置http-proxy和https-proxy,且https-proxy值必须以http://开头;仅配http-proxy会导致HTTPS请求静默直连,卡在Loading composer repositories或报cURL error 28;还需同步调高http.timeout和process-timeout,并确保镜像URL无尾部斜杠。

只配 http-proxy 一定失败,必须同时设 https-proxy
Composer 对 HTTP 和 HTTPS 请求走两套完全独立的代理路由。所有包源(Packagist、GitHub API、国内镜像)都走 HTTPS,只配 http-proxy 会导致这些请求静默 fallback 到直连,结果就是卡在 Loading composer repositories 或反复报 cURL error 28,却无明确提示。
正确写法:https-proxy 的值协议头必须是 http://,哪怕你的代理服务监听 HTTPS 端口:
-
http://127.0.0.1:7890(Clash / Proxyman 默认端口) -
http://user:pa%40ss%2Fword@127.0.0.1:8080(密码含@或/必须 URL 编码)
验证是否生效:composer config -g --list | grep -E "(http|https)-proxy",必须看到两行且格式合规。
http.timeout 和 process-timeout 必须一起调高
代理通了不等于下载稳——默认超时太短:
-
http.timeout控制单次 HTTPS 请求的 DNS 解析 + TLS 握手 + 首字节等待 + body 传输总时长,默认仅 300 秒,弱网下极易触发cURL error 28 -
process-timeout控制外部命令(如git clone、unzip)最大执行时间,默认 300 秒,Git 类包下载失败时它才真正起作用
只改一个大概率仍失败。推荐组合:
- 全局永久生效:
composer config -g http.timeout 600&&composer config -g process-timeout 1800 - 临时调试(优先级最高):
COMPOSER_HTTP_TIMEOUT=600 COMPOSER_PROCESS_TIMEOUT=1800 composer install
注意:php -i | grep default_socket_timeout 查出的 PHP 值若低于你设的 http.timeout(常见为 60),会提前掐断连接,必须同步调高。
镜像地址末尾多了一个 / 就会拼错 URL
即使代理和 timeout 都设对,仍可能卡在 Downloading https://...。常见隐形干扰之一是镜像配置里 URL 多了个斜杠:
- 错误写法:
"url": "https://mirrors.aliyun.com/composer/"(末尾/) - 正确写法:
"url": "https://mirrors.aliyun.com/composer"(无尾部/)
多一个 / 会导致 Composer 拼出类似 https://mirrors.aliyun.com/composer//packages.json 这样的非法路径,部分镜像服务器返回 404 或空响应,但 Composer 不报错,只无限等待。
临时下载失败,优先用 --timeout 而不是重装 Composer
遇到单次 composer install 超时,别急着升级或重装 Composer。新版并不解决底层 cURL 超时逻辑,反而可能引入兼容性问题(比如 PHP 8.3 下某些 2.5.x 版本会误判 SSL 上下文)。
更直接有效的做法是:
- 加参数重试:
composer install --timeout=600 - 跳过平台检查(避免因扩展缺失卡住):
composer install --ignore-platform-reqs --timeout=600 - 关掉并行下载(降低并发压力):
COMPOSER_DISABLE_PARALLEL=1 composer install --timeout=600
真正需要升级 Composer 的场景只有两个:PHP 版本升级后报 Composer requires PHP >=8.1.0,或者明确遇到已知 bug(比如 2.4.4 之前版本处理带空格的仓库名会崩溃)。











