mysqli是否在PHP 7.4中支持caching_sha2_password? - php

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

执行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;

但这引起了另一个错误:

用户'root'@'localhost'的访问被拒绝(使用密码:是)。

切换回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

参考方案

我对此进行了测试,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 auth时服务器意外响应:0 /5/Users/bkarwin/Documents/SO/my.php

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

不要使用空密码。

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP:将字符串拆分为字母和数字部分的最佳方法 - php

我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

PHP:检查目录是否为空的最佳和最简便的方法是什么 - php

Improve this question 我有一个包含数百个动态生成文件夹的根目录。随着时间的流逝,在这些目录必须为空的情况下,需要从系统中删除其中一些文件夹。实现这一目标的最佳的最短,最简单和/或最有效的方法是什么? 参考方案 使用glob:if (count(glob("path/*")) === 0 ) { // empty gl…