本质是PHP的mysqlnd扩展编译时未启用OpenSSL支持,导致无法建立SSL连接;需通过php -i | grep -i "mysqlnd" -A 10确认SSL support是否enabled,并在database.php中配置'encrypt' => TRUE及ssl_options。

PHP 7.4 下 CodeIgniter 3 报 “mysqlnd 不支持 SSL” 错误,本质不是 CodeIgniter 的问题,而是 PHP 的 mysqlnd 扩展在编译时未启用 OpenSSL 支持,导致无法建立带 SSL 的 MySQL 连接(比如连接云数据库、阿里云 RDS、腾讯云 CDB 或启用了强制 SSL 的 MySQL 8.0+ 实例)。
确认是否真为 mysqlnd 缺失 SSL 支持
运行以下命令检查当前 mysqlnd 是否启用 SSL:
php -i | grep -i "mysqlnd" -A 10
重点看输出中是否有类似:
- SSL support => enabled(✅ 正常)
- SSL support => disabled(❌ 问题根源)
- 或根本没出现 "SSL support" 字样(说明编译时未链接 OpenSSL)
常见原因与对应升级/修复方式
不是简单“升级 PHP 版本”就能解决,关键在于 mysqlnd 扩展的编译配置。PHP 7.4 自带的 mysqlnd 默认支持 SSL,但前提是系统 OpenSSL 版本 ≥ 1.0.2 且 configure 时启用了 --with-openssl。
立即学习“PHP免费学习笔记(深入)”;
- 系统 OpenSSL 版本过低(如 CentOS 7 默认 1.0.2k):虽满足最低要求,但部分云厂商要求 TLSv1.2+,需升级 OpenSSL 到 1.1.1 或更高(注意兼容性)
- PHP 是通过 yum/apt 安装的预编译包(如 EPEL、Ondrej PPA):多数已开启 SSL,但某些精简版或旧仓库包可能关闭了 —— 建议换用官方源或重装完整包,例如:
yum install php-mysqlnd php-opcache # CentOS/RHEL(确保含 openssl 依赖)<br>apt install php-mysqlnd # Ubuntu/Debian(通常默认启用 SSL)
手动验证并强制启用 SSL 连接(CodeIgniter 3 配置层面)
即使 mysqlnd 支持 SSL,CodeIgniter 3 默认不主动启用。需在 application/config/database.php 中显式配置:
- 确保使用
mysqli或mysqlnd作为dbdriver - 在
$db['default']数组中添加:
'encrypt' => TRUE,<br>'ssl_options' => [<br> 'ssl_ca' => '/path/to/rds-ca-bundle.pem', // 如阿里云 RDS 提供的根证书<br> 'ssl_cert' => '',<br> 'ssl_key' => '',<br>],
⚠️ 注意:ssl_ca 路径必须绝对且 Web 进程可读;若服务端允许非验证连接(如仅校验加密通道),可省略 ssl_ca,但 'encrypt' => TRUE 必须保留。
终极方案:重新编译 PHP(仅当包管理器无法满足时)
适用于自建环境、宝塔/AMH 等面板用户或需严格控制组件的场景:
- 先安装新版 OpenSSL(如 1.1.1w)并指定路径
- configure PHP 时明确加入:
--with-openssl=/usr/local/openssl - 确保
ext/mysqlnd/config9.m4中未屏蔽 SSL 检测逻辑(极少发生) - 编译后执行
php -m | grep mysqlnd和php -i | grep SSL双重确认



















