8

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

执行caching_sha2 auth 109时出现意外的服务器响应

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

所以我将我的 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 更改。但是,我没有更改任何mysqli配置。MySQL 的日志没有显示任何内容,apache2 日志仅显示“拒绝访问”错误消息。

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

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

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

4

2 回答 2

7

我对此进行了测试,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():在第 5 行的 /Users/bkarwin/Documents/SO/my.php 中执行缓存_sha2 身份验证时出现意外的服务器响应:0

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

不要使用空白密码。

于 2019-12-08T18:18:38.233 回答
3

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

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

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

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

于 2019-12-08T19:35:56.787 回答