答案是运行php -r "print_r(openssl_get_cert_locations());"确认default_cert_file和ini_cafile路径是否存在、可读、非空且更新于2023年后;若异常则需下载最新cacert.pem并同步配置curl.cainfo与openssl.cafile。

确认 PHP 实际加载的证书路径
Composer 报 SSL certificate problem: unable to get local issuer certificate 或卡在 Loading composer repositories,根本原因不是 Composer 本身,而是 PHP 的 OpenSSL/cURL 找不到或读不懂可信根证书。第一步必须查清它到底在读哪个文件:
运行:php -r "print_r(openssl_get_cert_locations());"
重点关注输出里的 default_cert_file 和 ini_cafile。如果为空、路径不存在、文件权限是 777(PHP 拒绝加载),或最后修改时间早于 2023 年(旧证书不含 ISRG Root X1),就直接导致验证失败。
常见陷阱:
- Homebrew PHP on macOS 默认指向一个损坏的
curl-ca-bundle.crt;重装命令:brew reinstall ca-certificates && brew link --force ca-certificates - Docker Alpine 镜像里
/etc/ssl/certs/ca-certificates.crt可能为空或未更新;需手动apk add ca-certificates并update-ca-certificates - Windows 下 php.ini 中写的是
curl.cainfo = "C:\php\extras\ssl\cacert.pem",但实际路径用了反斜杠没转义,PHP 读成乱码路径
用官方 cacert.pem 替换并统一配置两个 PHP 参数
别用系统自带的过期 bundle,直接下载 curl 官方维护的最新 cacert.pem(含完整信任链):
从 https://curl.se/ca/cacert.pem 下载,保存到稳定路径,例如:/usr/local/etc/php/cacert.pem(Linux/macOS)或 C:/php/extras/ssl/cacert.pem(Windows)。
在 CLI 模式生效的 php.ini 里,**必须同时设置且路径完全一致**:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
curl.cainfo="/usr/local/etc/php/cacert.pem" openssl.cafile="/usr/local/etc/php/cacert.pem"
改完后:
- CLI 用户:关闭并重开终端(PHP 不热加载 ini)
- Web 服务(Apache/Nginx):重启对应服务
- 验证是否生效:再跑一次
php -r "print_r(openssl_get_cert_locations());",看ini_cafile是否已更新为你的路径
项目级镜像配置不生效?先检查 repositories 字段是否存在
即使你执行了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,只要项目 composer.json 里有 "repositories": [...](哪怕只是空数组 []),全局配置就彻底失效——不是优先级低,是被跳过。
正确做法:
- 进项目根目录,运行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g) - 如果原
composer.json是"repositories": [],先手动改成"repositories": {}再执行,否则报错 - 验证:
composer config repo.packagist应输出完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
注意 URL 必须以 / 结尾,否则拼出 /composerpackages.json 导致 404,Composer 会静默 fallback 回 packagist.org。
自签名证书场景:追加根 CA 到系统 bundle 而非禁用验证
内网私有镜像或测试环境用了自签名证书,不能靠 --no-secure-http 或 COMPOSER_NO_SSL=1 解决——它们只关 HTTPS 强制要求,不绕过 OpenSSL 证书校验。真正要做的,是把你的 PEM 格式根 CA(以 -----BEGIN CERTIFICATE----- 开头)追加进系统级 CA bundle:
- Linux(Debian/Ubuntu):
sudo cp your-root.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates - CentOS/RHEL:
sudo cat your-root.crt >> /etc/pki/tls/certs/ca-bundle.crt或用trust extract-compat - macOS:双击证书 → “钥匙串访问” → “系统” 钥匙串 → 右键 → “显示简介” → “信任” → 设为“始终信任”
- Windows:双击 → “安装证书” → “本地计算机” → 存储位置选“受信任的根证书颁发机构”
做完后,所有 PHP HTTPS 请求(包括 file_get_contents()、curl_exec()、Composer)都会自动信任该 CA,无需单独配 cafile。
最易被忽略的一点:证书文件必须是 PEM 格式、不能混入中间证书或叶证书(除非你明确需要完整链)、权限不能是 777 ——PHP 会直接拒绝加载。

















