Composer卡在Loading composer repositories或报cURL error 35,本质是PHP底层TLS握手失败;主因是OpenSSL证书路径为空/损坏、CA文件陈旧(如缺ISRG Root X1)、php.ini中curl.cainfo与openssl.cafile未同时配置且指向同一有效绝对路径。

Composer 卡在 Loading composer repositories 或报 cURL error 35,基本可以确定是 TLS 握手失败,不是网络不通、不是镜像地址写错、更不是 Composer 本身坏了——问题在 PHP 底层的 OpenSSL 和 cURL 协同环节。
确认是不是 OpenSSL 证书路径失效
PHP 不会自动猜证书在哪,它只按 openssl_get_cert_locations() 返回的路径去读。路径为空、指向不存在的文件、或文件内容陈旧(比如最后更新是 2021 年),都会导致握手卡死。
- 运行
php -r "print_r(openssl_get_cert_locations());",重点看default_cert_file和ini_cafile是否一致、是否可读、文件大小是否 ≥ 100KB(太小说明是空包或过期 bundle) - 常见失效路径:
/etc/ssl/certs/ca-certificates.crt(Ubuntu 旧版)、C:/php/extras/ssl/cacert.pem(XAMPP 自带)、/usr/local/etc/php/cacert.pem(Homebrew PHP 未更新) - 别用 XAMPP/WAMP 自带的证书包——它们多数停更于 2021 年,不含 ISRG Root X1 等现代根证书
确保 php.ini 同时配齐两个关键配置项
只设 curl.cainfo 或只设 openssl.cafile 都不行。PHP 的 stream_context 和 cURL 扩展分别读不同字段,漏一个就 fallback 到空信任链。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 编辑
php.ini,取消注释或新增两行,路径必须完全相同且为绝对路径:openssl.cafile="/usr/local/etc/php/cacert.pem"curl.cainfo="/usr/local/etc/php/cacert.pem" - Windows 路径必须用正斜杠
/或双反斜杠\,单反斜杠会被解析为转义符 - 改完后:CLI 模式需新开终端;Web 模式(Apache/Nginx)必须重启整个服务,重载配置无效
验证镜像源是否真被 Composer 使用
很多人配了镜像却没生效,因为 composer diagnose 不验证真实请求链路,它只连官方源发 HEAD,完全不读你的配置。
- 运行
composer config -g repo.packagist,输出必须是完整 JSON,例如:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};若为空、为null或仍是https://packagist.org,说明配置失败 - 关键三要素缺一不可:
repo.packagist(注意是单数)、type值显式为"composer"、URL 末尾必须带/ - 项目级
composer.json中只要存在"repositories"字段(哪怕只是[]),全局配置就完全失效 - 真实请求地址看这里:
composer install -vvv 2>&1 | head -n 10 | grep Downloading,第一行 URL 才是实际发出的请求
排查系统代理或时间偏差引发的静默握手失败
某些代理(Clash、Surge、国产加速器)对 HTTPS 流量做 MITM,但 PHP 没加载其根证书;或者本地时间快 5 分钟 / 慢 2 分钟以上,OpenSSL 直接拒绝校验证书有效期——这两类问题都不报明显错误,而是卡在 Loading 阶段或报 generic SSL handshake failed。
- 临时关闭代理验证:
HTTP_PROXY= HTTPS_PROXY= composer install(Linux/macOS)或set HTTP_PROXY= && set HTTPS_PROXY= && composer install(Windows CMD) - 检查系统时间:运行
date对比 time.is,偏差 > 120 秒就必须修复。Linux/macOS 用sudo timedatectl set-ntp true;Windows 用w32tm /resync并指定time.nist.gov - 企业内网场景下,要把自签名根证书(PEM 格式)追加到
curl.cainfo指向的文件末尾,不是替换,也不是改 Composer 配置
真正麻烦的不是某一个点,而是这些环节相互遮掩:时间不准会让证书校验失败,证书失败又让代理根证书无法加载,代理失效再触发 DNS fallback……排查时必须用 php -r "print_r(openssl_get_cert_locations());" 和 curl -v https://mirrors.aliyun.com/composer/packages.json 双验证,跳过任何一步都可能绕回原点。

















