mysqli 在 PHP 7.4 中是否支持caching_sha2_password?

Does mysqli have support for caching_sha2_password in PHP 7.4?

提问人:Minding 提问时间:12/8/2019 最后编辑:Minding 更新时间:12/21/2019 访问量:4815

问:

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

执行caching_sha2身份验证 109 时出现意外的服务器响应

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

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

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

但这导致了另一个错误:

用户“root”@“localhost”的访问被拒绝(使用密码:YES)。

切换回 PHP 7.3,它又可以工作了。mysql_native_password

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

php7.4-mysqli 是否支持?是的caching_sha2_password

为什么我的密码被拒绝,我该如何解决? 查看我的后续问题

另外,如果MySQLi仍然不支持该插件:我该如何使用mysql_native_password

php mysql 身份验证 mysqli php-7.4

评论


答:

7赞 Bill Karwin 12/9/2019 #1

我对此进行了测试,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警告:mysqli::__construct():执行caching_sha2身份验证时意外的服务器响应:5 行 /Users/bkarwin/Documents/SO/my.php 中的 0

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

不要使用空白密码。

评论

0赞 Minding 12/9/2019
有趣。我没有使用空白密码(sry,应该更清楚)。但是知道它可以工作已经有所帮助。我会再试一次,看看我能不能避免,然后再来找你。Access Denied
0赞 Bill Karwin 12/9/2019
您设置了一个空白密码。当我尝试同样的事情时,它设置了一个空白密码。ALTER USER ... BY ''
0赞 Minding 12/9/2019
... BY '';只是短端版本,我居然进入了... BY 'mySecretPassword';
0赞 Minding 12/9/2019
我又试了一次,即使我从字面上复制了密码,我仍然有同样的问题。我的PHP实际上是比你的早一天构建的:也许它只是一个错误?Access DeniedPHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )
1赞 Bill Karwin 12/9/2019
我无法重现,所以我不知道。我真的希望相隔一天编译的相同PHP版本不会有什么不同。
3赞 Machavity 12/9/2019 #2

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

  1. 您正在使用身份验证方法。这就是PHP通过MySQL CLI接口连接到MySQL的方式。MySQL自己的客户端将始终支持自己的身份验证方法。mysql_client
  2. 您使用的是 7.4 以下的 MySQLND。显然,这是对未宣布的本地驱动程序的改进

    是的,由于对 ext/hash 的硬依赖,这现在仅在 7.4 中。

    它仍然存在一些可能的问题。

评论

0赞 Minding 12/9/2019
真正让我感到困惑的是,传输部分一切正常,但我的密码被拒绝了。即使我从字面上复制粘贴它,并且只有第一个有效。mysql_native_passwordcaching_sha2_password
0赞 Minding 12/9/2019
你知道如何在原生驱动程序和mysql客户端之间切换吗?
0赞 Machavity 12/10/2019
取决于服务器的设置方式。PHP手册介绍了一些常见的设置。
0赞 Minding 12/10/2019
谢谢,我正在使用 ,这可能是这里的问题,所以我想我会等待全面支持。mysqlnd
0赞 Minding 12/21/2019
如果你能看看我的后续问题,那就太好了。