PHP 7.4 和 MySQL 连接

PHP 7.4 and MySQL Connections

我曾在另一个论坛上发布过这个,认为它与 Ubuntu 相关并且 MySQL 与 PHP 不兼容,但后来我意识到 mysqli 确实正在加载并且与它通信作为 phpinfo() 显示 mysqli 是 运行 所以我遇到的问题似乎与 PHP 7.4 版连接数据库的方式的变化有关。

它显然与密码有关,那么即使不向后兼容,也必须对其进行哪些更改才能使其正常工作?我的本地开发数据库使用一个简单的密码,我不确定我需要做什么才能让它再次工作,同时仍然保持与实时服务器上旧 MySQL 5.X 的兼容性,但我的网站使用此功能连接。

我在这里和其他地方查看了 和其他几个人,并尝试了上面链接示例中提供的测试代码,但仍然无法连接。

function dbConn($DBname) {
    global $DBhost;
    global $DBusername;
    global $DBpass;
    $dbconn = new mysqli($DBhost, $DBusername, $DBpass, $DBname);
    mysqli_set_charset($dbconn,"UTF8");
    return $dbconn;
}

我是 运行 Ubuntu 19.10,Apache2 2.4.41 和 MySQL 8.0.18,甚至 mysql_native_password已启用,但出现错误。

Warning: mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 109 in /var/www/html/testsite.loc/db_test.php on line 32

Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in /var/www/html/testsite.loc/db_test.php on line 32

Warning: mysqli::query(): Couldn't fetch mysqli in /var/www/html/testsite.loc/db_test.php on line 33

Fatal error: Uncaught Error: Call to a member function fetch_row() on bool in /var/www/html/testsite.loc/db_test.php:34 Stack trace: #0 {main} thrown in /var/www/html/testsite.loc/db_test.php on line 34

根本问题是为用户分配了不受支持的身份验证插件,这导致密码不匹配。您可以以不同方式配置开发 MySQL 服务器,以建立类似的环境。为此,您必须编辑 /etc/mysql/my.cnf:

[mysqld]
...
default-authentication-plugin = mysql_native_password

但是,我更愿意建议将生产环境升级到 PHP 7.4 和 MySQL 8.0,以便使用 caching_sha2_password 代替,这是默认的身份验证插件,因为MySQL 8.0。也可以在部署期间通过 MySQL CLI 更新密码 - 但 运行 相同的配置是最轻松的 - 也是测试它最可靠的。

Upgrading to MySQL 8.0 : Default Authentication Plugin Considerations解释的很详细

解决方案是简单地将数据库密码更改为可以使用的密码,方法是在终端中登录 mysql:

sudo mysql -p -u root

然后 运行 mysql> 提示符下的每一个:

ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YOUR_PASSWORD';

FLUSH PRIVILEGES;

由于我的代码没有改变并且仍然使用与以前相同的密码,因此它应该可以在本地 PHP 7.4 和实时 5.X 上运行。不过,我不确定如何在实时服务器上执行此操作,因为我无法访问 mysql table.