composer卡在loading composer repositories或报curl error 35,主因是php底层tls握手失败,90%以上源于dns解析失败、openssl版本过旧或ca证书路径为空/损坏;需用ping和curl -i验证dns,用php -r"print_r(openssl_get_cert_locations());"与curl -v双重检查证书路径,并确保php.ini中curl.cainfo与openssl.cafile指向同一有效cacert.pem且重启环境。

Composer 卡在 Loading composer repositories 或报 cURL error 35、SSL handshake failed,不是 Composer 本身出错,而是 PHP 底层 TLS 握手被阻断——DNS 解析失败、OpenSSL 版本过旧、CA 证书路径为空或损坏,这三类原因占全部案例的 90% 以上。
怎么看是不是 DNS 解析失败
直接运行 ping packagist.org:
- 返回
unknown host→ DNS 解析失败,立刻换 DNS(如 Linux/macOS 改/etc/resolv.conf加nameserver 8.8.8.8;Windows 在网络适配器里手动设置) - 返回 IP 但
curl -I https://packagist.org/packages.json卡住 → 不是 DNS 问题,继续排查 TLS 层 -
curl -I能秒回HTTP/2 200→ DNS 和基础连通性 OK,问题大概率在 PHP 的证书链或代理劫持
怎么验证 OpenSSL 证书路径是否真有效
两步闭环验证,比看错误字眼更可靠:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
php -r "print_r(openssl_get_cert_locations());",紧盯default_cert_file和ini_cafile字段:路径是否存在?文件大小是否 ≤10KB?(过小说明是空包或陈旧 bundle) - 再跑
curl -v https://packagist.org/packages.json:如果也报SSL certificate problem: unable to get local issuer certificate,说明问题出在 PHP/cURL 层级,跟 Composer 配置、代理、DNS 全都无关 - Windows 用户尤其注意:XAMPP/WAMP 自带的
curl-ca-bundle.crt多数停更于 2021 年,不含 ISRG Root X1 等现代根证书,openssl拒绝验证
为什么改了 php.ini 还不生效
php.ini 中必须同时配齐 curl.cainfo 和 openssl.cafile:
- 只改一个,PHP 会 fallback 到空信任链;路径不一致,等于没配
- 两者必须指向同一个
cacert.pem文件,且为绝对路径(例如 Linux/macOS:/usr/local/etc/php/cacert.pem;Windows:C:/phpEnv/php/extras/ssl/cacert.pem) - 改完必须重启终端(Windows)或重载 PHP 服务(Apache/Nginx),否则配置不生效
- 别信
composer diagnose:它只对官方源发一次 HTTP HEAD(走 80 端口),不校验 HTTPS,也不读你的镜像配置
怎么确认镜像到底有没有真走通
很多人执行 composer config -g repo.packagist 后就以为搞定了,但终端里仍卡在 Downloading https://packagist.org/p/...:
- 运行
composer config -g repo.packagist,输出必须是类似{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},而不是packagist.org - 手动测试镜像连通性:
curl -I https://mirrors.aliyun.com/composer/packages.json,要能秒回HTTP/2 200 - 只要项目根目录
composer.json里有"repositories"字段(哪怕只是空数组),全局镜像就完全失效 - 验证真实请求地址:用
composer install -vvv 2>&1 | grep Downloading看第一行 URL,别信config输出
真正卡点在 Loading composer repositories 阶段,本质是 DNS 解析失败或 TLS 握手卡在 OpenSSL 层,http.timeout 参数此时完全无效。最常被忽略的是:证书路径配置了但没重启终端,或者 curl.cainfo 和 openssl.cafile 指向了两个不同文件。










