换镜像源后仍“connection reset by peer”,根本原因是tls握手前被中间设备(如运营商nat、防火墙)主动发rst中断,抓包可见client hello发出后无server hello即出现rst,问题在底层网络而非composer配置;需强制ipv4、校准php.ini中curl.cainfo与openssl.cafile绝对路径并重启服务。

为什么换镜像源后 still connection reset by peer
换源没用,大概率不是镜像地址错了,而是 TCP 连接在 TLS 握手前就被中间设备(如运营商 NAT、防火墙)发 RST 包掐断。抓包能看到 Client Hello 发出去,但没收到 Server Hello,紧接着出现 TCP RST —— 这说明问题压根不在 Composer 配置,而在底层网络链路。
常见于三大运营商中某几家的城域网出口策略,尤其对 HTTPS 流量做深度检测或连接数限制。此时 composer config -g repo.packagist 再正确也无效。
- 先验证:运行
curl -v https://mirrors.aliyun.com/composer/packages.json,停在* TLS handshake就是握手卡死 - 临时绕过:加环境变量
CURL_IPRESOLVE=4强制走 IPv4(Linux/macOS),Windows 用户需在命令行先执行set CURL_IPRESOLVE=4 - 别信“多试几次”,RST 是主动拒绝,不是抖动,重试只会复现失败
阿里云/腾讯云镜像仍 503 或超时怎么办
国内主流镜像站本身稳定,但它们作为反向代理,会放大上游异常或本地 DNS 解析延迟。遇到 503 Service Temporarily Unavailable 或 curl: (28) Operation timed out,优先排查是否真连上了镜像站,而不是改 Composer 配置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 手动测镜像可用性:
curl -I https://mirrors.cloud.tencent.com/composer/必须返回HTTP/2 200,否则换源 - 推荐备用镜像(2026 年实测更稳):
https://packagist.proxy.fly.dev(无 CDN 依赖,直连模式抗干扰强) - 绑定 hosts 绕过 DNS:
echo "123.56.123.45 mirrors.cloud.tencent.com" | sudo tee -a /etc/hosts(IP 请用dig mirrors.cloud.tencent.com +short获取最新) - 避免用清华源——其反向代理逻辑对 TLS 握手异常更敏感,容易因 header 缺失直接放弃请求
全局 config 不生效的三个硬伤
composer config -g repo.packagist 看似成功,实际静默失败极常见。三个条件缺一不可,漏一个就 fallback 到官方源:
- 键名必须是
repo.packagist(不是repos.packagist,多一个 s 就忽略) - 中间必须显式写
composer作为 type:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(漏掉composer会当普通 URL 处理) - URL 必须以
/结尾,否则拼出/composerpackages.json导致 404 - Windows 用户执行后必须关掉当前终端再重开,否则环境变量未刷新,
composer config -g repo.packagist查不到值
PHP 层证书路径错配才是隐形杀手
Composer 的 HTTPS 请求由 PHP 的 cURL 扩展发起,composer config -g cafile 只影响内部 HTTP 客户端(php-http),对真实 TLS 握手完全无效。真正起效的是 php.ini 中两个配置项,且路径必须绝对、一致、可读。
- 确认 CLI 模式加载的 php.ini:
php --ini,别改错文件 - 下载最新
cacert.pem(如从 curl.se),存到确定路径,例如/usr/local/etc/php/cacert.pem - 在 php.ini 末尾加两行(注意无引号、无转义、路径全小写):
curl.cainfo = "/usr/local/etc/php/cacert.pem"openssl.cafile = "/usr/local/etc/php/cacert.pem" - 改完必须重启:CLI 用户关终端重开;Web 用户重启
php-fpm或 Apache
最易被忽略的是:PHP CLI 和 Web SAPI 加载的 php.ini 往往不同,php --ini 和 phpinfo() 输出的 “Loaded Configuration File” 必须分别核对。










