Composer卡在“Loading composer repositories”是因HTTPS CONNECT隧道未建立成功;必须同时配置http-proxy和https-proxy,且后者值必须以http://开头,否则静默直连导致卡死、超时或502错误。

Composer卡在Loading composer repositories就是代理握手失败
这不是网络慢,而是 HTTPS CONNECT 隧道没建起来。Composer 用 https-proxy 字段发起隧道请求,但若代理服务未正确响应、SNI 被劫持、或 TLS 协议不兼容(比如强制降级到 TLS 1.2),就会卡在那一行不动,既不报错也不超时——本质是底层 cURL 等待 TLS 握手完成,而代理端迟迟没发回 Server Hello。
常见现象包括:Loading composer repositories 后无任何输出、curl error 35、SSL routines:ssl3_read_bytes:sslv3 alert handshake failure,或 Failed to enable crypto。注意:这些都不是证书过期,也不是域名不对,而是握手流程中断。
- 先验证是否真由代理引起:临时清空环境变量再跑命令
Windows CMD:set HTTP_PROXY= && set HTTPS_PROXY= && composer install
macOS/Linux:HTTP_PROXY= HTTPS_PROXY= composer install - 若此时成功,说明问题锁定在代理链;若仍卡住,则可能是系统 CA 信任问题或 OpenSSL 版本太旧
- 别只看
composer config -g --list输出了http-proxy就以为配好了——必须同时存在http-proxy和https-proxy,缺一不可
https-proxy必须写成http://开头,否则静默失效
这是 Composer 的硬性路由规则,不是可选项。哪怕你的代理监听的是 HTTPS 端口(如 https://127.0.0.1:7890),https-proxy 的值也必须以 http:// 开头,否则 Composer 会跳过该字段,直接 fallback 到直连。
错误写法(全部无效):https://127.0.0.1:7890、127.0.0.1:7890、http://[::1]:7890(IPv6 地址未加方括号也会失败)
- 正确写法示例:
http://127.0.0.1:7890(Clash/Proxyman 默认) - 带认证时用户名密码含
@或/必须 URL 编码:http://user:pa%40ss%2Fword@127.0.0.1:8080 - 配置后务必运行
composer config -g --list | grep -E "(http|https)-proxy"确认两行都存在且协议头合规
NTLM 代理或企业 WAF 下必须引入中转层
Composer 原生不支持 NTLM 认证,直接设 http-proxy 会返回 407 Proxy Authentication Required 或静默卡死。这不是配置问题,是协议不兼容。
解决方案不是改 Composer,而是加一层能处理 NTLM 的中转代理:
- Windows 企业环境推荐
cntlm或px:它们监听127.0.0.1:3128,负责与域控协商 NTLM,再把流量转发给上游代理 - 然后统一把 Composer 的
http-proxy和https-proxy都指向http://127.0.0.1:3128 - 验证中转是否生效:
curl -x http://127.0.0.1:3128 -I https://packagist.org/packages.json,如果返回 407,说明中转没配好;如果返回 200 + JSON,说明通了
杀掉卡住的 Composer 进程要分两层
Composer 卡住时,往往不是单个 PHP 进程,而是父子进程嵌套:主进程在等 cURL 返回,cURL 在等 socket 数据,socket 又卡在 TLS 层。直接 Ctrl+C 有时无法退出,因为信号被阻塞。
- Linux/macOS 下优先用
pkill -f "composer install"或pkill -f "php.*composer"彻底清理 - Windows 下打开任务管理器,按 CPU/时间排序,找
php.exe进程并结束;若仍有残留,用 PowerShell:Get-Process php* | Stop-Process -Force - 更关键的是清理缓存和临时文件:
composer clear-cache+ 手动删$(composer config cache-dir)/files/下残留的半截 ZIP,否则重试还会复用坏文件
真正容易被忽略的是:即使代理配置全对,只要系统环境变量(HTTP_PROXY/HTTPS_PROXY)还开着,Composer 就会优先读它们,覆盖掉 composer config 里的设置——每次排查前,先确认这两个变量是否为空。


















