Composer必须同时配置http-proxy和https-proxy才能走通Packagist请求,因官方源全量走HTTPS,而http-proxy仅处理HTTP请求,https-proxy才用于建立CONNECT隧道;缺一或协议错误(如https-proxy写成https://)会导致静默失败,卡在“Loading composer repositories”。

Composer 必须同时配置 http-proxy 和 https-proxy 才能走通 Packagist 请求,只配一个或协议写错(比如用 https:// 开头)会导致静默失败——现象是 composer install 卡在 “Loading composer repositories”,无报错但超时。
为什么只设 http-proxy 没用
Packagist、GitHub 等所有官方源全量走 HTTPS,而 Composer 对代理是严格分协议路由的:http-proxy 只处理 http:// 请求,https-proxy 才用于建立 CONNECT 隧道转发 https:// 流量。漏掉后者,请求直接 fallback 到直连,国内环境基本必超时。
-
https-proxy的值必须是http://协议开头(哪怕代理本身监听 TLS 端口),这是 Composer 的硬性约定 - 填成
https://127.0.0.1:8080或漏协议头(如127.0.0.1:8080)会静默失效,curl测试也通不过 - 密码含
@、/、:必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword,可用php -r "echo rawurlencode('pa@ss/word');"生成
composer config -g 配代理的正确命令顺序
必须两条都执行,且加 -g(等价于 --global),否则只写入当前项目 composer.json,换目录就失效:
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:pass@127.0.0.1:7890;不支持https://代理地址 - Windows 下若报
Could not write to file,检查%APPDATA%\Composer\config.json目录是否存在且可写 - 验证是否生效:运行
composer config -g --list | grep -E "(http|https)-proxy",输出里必须同时出现两行,且格式正确
端口配对失败的典型现象和快速验证法
配了代理还卡住?别猜,用 curl 直接复现 Composer 的请求路径:
curl -x http://127.0.0.1:7890 -I https://packagist.org/packages.json
- 返回
407 Proxy Authentication Required→ 代理要认证但没传凭据,或公司用 NTLM(Composer 原生不支持,得用cntlm或px中转) - 返回
Connection refused或超时 → 代理进程未运行、端口填错、防火墙拦截 - 返回
502 Bad Gateway→ 代理不支持 CONNECT 隧道(如老旧 HTTP 代理),换 Clash/Squid 4.0+ -
file_get_contents(): SSL operation failed→ 代理转发 TLS 流量异常,优先换用http://代理绕过证书校验
腾讯云/CVM 环境下更推荐切镜像源而非配代理
在腾讯云服务器上,composer install 卡顿大概率不是网络不通,而是 DNS 解析慢或 TLS 握手卡在海外节点。直接切镜像比配代理更快更稳:
composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/ composer clear-cache
- URL 末尾的
/不能少,少了会报Invalid repository type - 若项目级
composer.json里有repositories字段,它会覆盖全局配置,得先删掉或注释 - 执行
composer show laravel/framework --no-ansi | head -n 3,看到 URL 含mirrors.cloud.tencent.com就说明生效了
真正容易被忽略的是:Composer 不读系统 HTTP_PROXY 环境变量,也不自动降级 fallback;它只认自己配置里的两个字段,且要求严格匹配协议与端口。任何一环出错,都是静默失败——没有错误提示,只有无限等待。


















