mysqli 是不是支持 PHP 7.4 中的 caching_sha2_password?
Posted
技术标签:
【中文标题】mysqli 是不是支持 PHP 7.4 中的 caching_sha2_password?【英文标题】:Does mysqli have support for caching_sha2_password in PHP 7.4?mysqli 是否支持 PHP 7.4 中的 caching_sha2_password? 【发布时间】:2020-04-01 12:13:57 【问题描述】:当我尝试从 php 7.3 升级到 PHP 7.4 时,我收到了这个错误:
执行caching_sha2 auth 109 时出现意外的服务器响应
在我看来,这表明 PHP 7.4 mysqli 正在尝试使用 caching_sha2_password
插件。 This article 指出 PHP MySQLi 不支持该插件(它还暗示将来会支持它),但由于 PHP 7.4 是新的并且似乎正在尝试使用它,我想它应该可以工作。此外,错误消息与不受支持的情况不同(拒绝访问 vs. 身份验证方法未知)。
所以我将我的 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
? 是
为什么我的密码被拒绝,我该如何解决? See my follow-up question
另外,如果 MySQLi 仍然不支持该插件:我该如何使用mysql_native_password
?
【问题讨论】:
【参考方案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():在第 5 行的 /Users/bkarwin/Documents/SO/my.php 中执行缓存_sha2 身份验证时出现意外的服务器响应:0
当我恢复密码并将其设置为非空字符串时,它解决了问题。
不要使用空白密码。
【讨论】:
有趣。我没有使用空白密码(对不起,应该更清楚)。但是知道它可以工作已经有所帮助。我再试一次,看看能不能避开Access Denied
,然后再回复你。
您使用ALTER USER ... BY ''
设置了一个空白密码。当我尝试同样的事情时,它设置了一个空白密码。
... BY '';
只是简写,其实我输入的是... BY 'mySecretPassword';
我又试了一次,我仍然遇到同样的问题Access Denied
,尽管我确实复制了密码。我的 PHP 实际上是在你的前一天构建的:PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )
也许这只是一个错误?
我无法重现,所以我不知道。我真的希望分开一天编译的 same PHP 版本不会有什么不同。【参考方案2】:
这有几种可能发生的方式
-
您正在使用
mysql_client
身份验证方法。这就是 PHP 过去通过 MySQL CLI 接口连接到 MySQL 的方式。 MySQL 自己的客户端将始终支持自己的身份验证方法。
您在 7.4 下使用 MySQLND。显然 this was an improvement to the native driver 没有宣布
是的,由于对 ext/hash 的严重依赖,目前仅在 7.4 中提供。
There are still some possible issues with it.
【讨论】:
真正让我困惑的是,传输部分一切正常,但我的密码被拒绝。尽管我从字面上复制粘贴mysql_native_password
和 caching_sha2_password
并且只有第一个有效。
你知道如何在原生驱动和mysql客户端之间切换吗?
取决于您的服务器的设置方式。 PHP Manual 介绍了一些常见的设置。
谢谢,我正在使用mysqlnd
,这可能是这里的问题,所以我想我会等待全力支持。
如果您可以查看my follow-up question,那就太好了。以上是关于mysqli 是不是支持 PHP 7.4 中的 caching_sha2_password?的主要内容,如果未能解决你的问题,请参考以下文章