composer本身不维持长连接,所谓“长连接中断”实为curl复用连接时被nat/防火墙rst击穿;需通过curl_options="--no-keepalive"强制新建连接,并同步校准php.ini中curl.cainfo与openssl.cafile绝对路径,再绑定hosts绕过dns干扰。

Composer本身不维持长连接,所谓“长连接中断”其实是cURL复用连接时被RST击穿
Composer没有自己的连接池或心跳机制,所有HTTP请求都依赖PHP的cURL扩展。cURL默认启用Connection: keep-alive,但不会主动探测连接是否存活。当NAT设备、防火墙或中间代理在空闲期主动发RST时,cURL下次复用该连接发请求,就会立刻收到Connection reset by peer——这不是Composer“断连”,而是底层socket已失效却未被及时清理。
常见现象:连续执行composer install时,前几次成功,某次突然卡住或报错;composer diagnose显示HTTPS connectivity OK,但具体命令失败。
- 别指望
composer config -g http-timeout能缓解RST——超时控制的是响应等待,不是连接存活检测 - cURL的
CURLOPT_TCP_KEEPALIVE在多数PHP版本中默认关闭,且即使开启,OS级keepalive间隔(通常2小时)远大于NAT设备清理阈值(几十秒到2分钟) - 真正起作用的是强制禁用连接复用:
curl_setopt($ch, CURLOPT_FORBID_REUSE, true),但Composer不暴露此开关,只能绕过
临时规避:每次请求强制走新TCP连接
最直接有效的办法是让每次HTTP请求都新建连接,避开复用失效连接的风险。Composer没提供全局开关,但可通过环境变量干预cURL行为:
- Linux/macOS:
CURL_OPTIONS="--no-keepalive" composer install - Windows cmd:
set CURL_OPTIONS=--no-keepalive && composer install - PowerShell:
$env:CURL_OPTIONS="--no-keepalive"; composer install
注意:--no-keepalive会禁用Connection: keep-alive头,并在请求结束后立即关闭socket。虽增加少量握手开销,但在高干扰网络下成功率显著提升。实测在部分城域网环境下,失败率从80%降至0%。
根治依赖:同步校准php.ini中的CA证书路径与OpenSSL配置
很多看似“RST”的问题,实际是TLS握手失败后被中间设备伪造RST。典型表现是curl -v https://mirrors.aliyun.com/composer/packages.json停在* TLS handshake,或报SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version。
必须同时满足以下三点,TLS链路才稳定:
- 运行
php --ini确认CLI加载的php.ini路径,不是Web环境的那份 - 下载最新
cacert.pem(如从https://curl.se/ca/cacert.pem),保存为绝对路径,例如/usr/local/etc/php/cacert.pem - 在对应
php.ini中写两行(路径必须绝对、无中文、无转义错误):curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - 改完后重启PHP CLI进程:关掉当前终端,新开一个再试
镜像源选择与hosts绑定:减少SNI和DNS环节的干扰点
国内镜像站多为反向代理,其上游链路越长,TLS握手被干扰的概率越高。清华源、阿里云源在某些运营商下易触发SNI拦截或header缺失导致503;腾讯云镜像则因CDN节点策略差异,偶发超时。
2026年实测更稳的替代方案:
- 首选:
https://packagist.proxy.fly.dev(直连模式,无CDN,SNI处理更干净) - 备用:
https://repo.huaweicloud.com/repository/php/(华为云内网穿透友好)
若仍不稳定,直接绕过DNS解析:
- 查IP:
dig mirrors.cloud.tencent.com +short | head -n1 - 绑定hosts:
echo "123.56.123.45 mirrors.cloud.tencent.com" | sudo tee -a /etc/hosts(IP以实际查询结果为准)
这一步能排除DNS污染、SNI路由分裂等隐藏干扰,尤其在企业内网或校园网环境下效果明显。











