必须手动启用mysqli扩展并重启服务,否则new mysqli()或mysqli_connect()会报错;需编辑phpEnv对应版本的php.ini取消extension=mysqli注释,执行phpenv rehash,再用指定PHP路径验证扩展加载与连接实例创建。

phpEnv 默认不启用 mysqli 扩展,必须手动修改配置并重启服务,否则所有 new mysqli() 或 mysqli_connect() 调用都会报错“Class 'mysqli' not found”或“Call to undefined function mysqli_connect()”。
确认 phpEnv 当前 PHP 版本和扩展目录
phpEnv 是多版本 PHP 环境管理工具,不同 PHP 版本的配置文件、扩展路径完全独立。先确定你正在使用的版本:
- 运行
phpenv versions查看已安装版本,带 * 号的是当前激活版 - 执行
phpenv which php获取当前 PHP 二进制路径(如~/.phpenv/versions/8.2.12/bin/php) - 对应配置文件在
~/.phpenv/versions/8.2.12/etc/php.ini(不是系统全局的/etc/php.ini) - 扩展目录通常为
~/.phpenv/versions/8.2.12/lib/php/extensions/no-debug-non-zts-20220829/(后缀随 PHP 版本变化)
在 phpEnv 中启用 mysqli 扩展(非编译安装)
phpEnv 安装的 PHP 通常已内置 mysqli,但默认未加载。只需编辑对应版本的 php.ini:
- 打开
~/.phpenv/versions/X.Y.Z/etc/php.ini(X.Y.Z 替换为你的实际版本) - 搜索
;extension=mysqli—— 注意:phpEnv 下一般用extension=mysqli(Linux/macOS),不是extension=php_mysqli.dll(那是 Windows) - 取消注释:删掉行首分号,改为
extension=mysqli - 确保
extension_dir指向正确的扩展目录(可从php -i | grep extension_dir验证) - 保存后,**必须重新加载 PHP 环境**:
phpenv rehash,否则改动不生效
验证 mysqli 是否真正可用
仅靠 php -m | grep mysqli 不够可靠 —— phpEnv 下该命令可能显示系统 PHP 的模块,而非当前版本。正确验证方式:
立即学习“PHP免费学习笔记(深入)”;
- 执行
~/.phpenv/versions/X.Y.Z/bin/php -m | grep mysqli(明确指定二进制路径) - 或写一个测试脚本
test_mysqli.php:
<?php
if (extension_loaded('mysqli')) {
echo "✅ mysqli 扩展已加载\n";
} else {
echo "❌ mysqli 扩展未加载\n";
}
$conn = @new mysqli('127.0.0.1', 'root', '', 'mysql');
if ($conn->connect_error) {
echo "⚠️ 连接失败: " . $conn->connect_error . "\n";
} else {
echo "✅ mysqli 连接实例可创建\n";
$conn->close();
}
?>然后运行 ~/.phpenv/versions/X.Y.Z/bin/php test_mysqli.php。输出两个 ✅ 才算真正就绪。
常见失败原因和绕过坑点
phpEnv 用户最容易卡在这几个地方:
-
php -m显示 mysqli,但 Web 环境(如 Apache + php-fpm)仍报错 → 因为 Web 服务用的是另一个 PHP 版本或配置,需检查phpinfo()中显示的Loaded Configuration File - 启用后出现
Unable to load dynamic library 'mysqli'→ 扩展文件名不匹配,比如实际是mysqli.so,但php.ini写了extension=mysqli(正确)或extension=mysqli.so(部分旧版需带 .so,新版自动补) - 使用
mysqlnd还是libmysqlclient不影响启用,但影响连接行为(如mysqli::get_client_info()返回值不同),phpEnv 默认走 mysqlnd,无需额外干预 - 如果项目依赖 PDO MySQL,别忘了同时加
extension=pdo_mysql,它和 mysqli 是两个独立扩展
最隐蔽的问题是:改了 php.ini 但忘了 phpenv rehash,或者用了 phpenv local 切换版本后没更新当前 shell 的 PATH —— 此时你以为在用 8.2,实际执行的是系统 PHP 7.4。



















