mysqli 是否支持 PHP 7.4 中的 caching_sha2_password?

Does mysqli have support for caching_sha2_password in PHP 7.4?

当我尝试从 PHP 7.3 升级到 PHP 7.4 时,我收到此错误:

Unexpected server response while doing caching_sha2 auth 109

如我所见,这表明 PHP 7.4 MySQLi 正在尝试使用 caching_sha2_password 插件。 This article 指出 PHP MySQLi 不支持该插件(它也暗示将来会支持它),但由于 PHP 7.4 是新的并且似乎正在尝试使用它,我想它应该工作。此外,错误消息与不支持时不同(访问被拒绝身份验证方法未知)。

所以我将 MySQL 身份验证插件更改为 caching_sha2_password(使用与之前相同的密码):

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;

但这导致了另一个错误:

Access denied for user 'root'@'localhost' (using password: YES).

切换回 PHP 7.3 并且 mysql_native_password 它再次工作。

我对两个插件、同一个网站使用了相同的密码,并应用了相同的 php.ini 更改。 但是我没有更改任何 mysqli 配置。 MySQL 的日志不显示任何内容,apache2 日志仅显示 'Access Denied' 错误消息。

php7.4-mysqli 是否支持caching_sha2_password

为什么我的密码被拒绝,我该如何解决?

此外,如果 MySQL我仍然不支持该插件:我如何使用它来使用 mysql_native_password

我对此进行了测试,PHP 7.4 中的 mysqli 确实支持 caching_sha2_password。

php -v
PHP 7.4.0 (cli) (built: Nov 29 2019 16:18:44) ( NTS )

这是我编写的一个简单的 PHP 脚本,用于连接 docker 容器中的 MySQL 8.0.17 运行(使用端口 6603):

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', 'root', '', 6603);
$result = $conn->query("SELECT NOW()");
$now = $result->fetch_row()[0];
echo "$now\n";

我确认我的 MySQL 实例正在使用 caching_sha2_password:

mysql> select user,host,plugin from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

mysql> select @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |
+---------------------------------+

运行我的PHP脚本,成功了。

php my.php
2019-12-08 18:11:58

但是,当我像您一样尝试将密码更改为 '' 时,我能够重现相同的错误:

PHP Warning: mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 0 in /Users/bkarwin/Documents/SO/my.php on line 5

当我恢复密码时,将其设置为非空字符串,问题就解决了。

不要使用空白密码。

有几种可能会发生这种情况

  1. 您正在使用 mysql_client 身份验证方法。这就是 PHP 过去通过 MySQL CLI 界面连接到 MySQL 的方式。 MySQL自己的客户端将始终支持自己的身份验证方法。
  2. 您在 7.4 下使用 MySQLND。显然 this was an improvement to the native driver 没有宣布

    Yes, this is only in 7.4 right now, due to the hard dependency on ext/hash.

    There are still some possible issues with it.