【问题标题】:PHP 7.4 and MySQL ConnectionsPHP 7.4 和 MySQL 连接
【发布时间】:2020-04-15 03:15:57
【问题描述】:

我在另一个论坛上发布了这篇文章,认为它与 Ubuntu 相关,并且 MySQL 与 PHP 不兼容,但后来我意识到 mysqli 确实在加载并与之通信,因为 phpinfo() 表明 mysqli 正在运行,所以我遇到的问题似乎与 PHP 7.4 版连接数据库的方式发生了变化有关。

它显然与密码有关,因此即使不向后兼容,也必须对其进行哪些更改才能使其正常工作?我的本地开发数据库使用一个简单的密码,我不确定我需要做什么才能让它再次工作,同时仍然保持与实时服务器上旧 MySQL 5.X 的兼容性,但我的网站使用此功能进行连接。

我确实在此处和其他地方查看了 another posting 和其他几个人,并尝试了上面链接示例中提供的测试代码,但仍然无法连接。

function dbConn($DBname) {
    global $DBhost;
    global $DBusername;
    global $DBpass;
    $dbconn = new mysqli($DBhost, $DBusername, $DBpass, $DBname);
    mysqli_set_charset($dbconn,"UTF8");
    return $dbconn;
}

我正在运行带有 Apache2 2.4.41 和 MySQL 8.0.18 的 Ubuntu 19.10,即使启用了 mysql_native_password,它也会出现错误。

Warning: mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 109 in /var/www/html/testsite.loc/db_test.php on line 32

Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in /var/www/html/testsite.loc/db_test.php on line 32

Warning: mysqli::query(): Couldn't fetch mysqli in /var/www/html/testsite.loc/db_test.php on line 33

Fatal error: Uncaught Error: Call to a member function fetch_row() on bool in /var/www/html/testsite.loc/db_test.php:34 Stack trace: #0 {main} thrown in /var/www/html/testsite.loc/db_test.php on line 34

【问题讨论】:

  • 在 PHP5 上运行生产系统有什么好的理由吗?
  • 您发布的代码在 PHP 5 和 PHP 7 中的工作方式相同。连接到 MySQL 的方式没有变化。
  • 唯一不兼容的是旧的mysql 扩展,它在PHP 7 中被删除。但PDOmysqli 基本相同。
  • 这段代码在 PHP 7.3 中工作,但不适用于 7.4,据我了解,这与密码有关。至于为什么 PHP 5 在生产系统上,我无法控制它,因为它是一个托管系统。显然我可以更新它,但我仍然有一个无法在 7.X 版本上运行的大型旧站点,并且重写尚未准备好上线。

标签: php mysqli php-7.4


【解决方案1】:

根本问题是为用户分配了不受支持的身份验证插件,这导致密码不匹配。您可以不同地配置您的开发 MySQL 服务器,以建立类似的环境。为此,您必须编辑/etc/mysql/my.cnf

[mysqld]
...
default-authentication-plugin = mysql_native_password

但是,我宁愿建议将生产环境升级到 PHP 7.4 和 MySQL 8.0,以便改用 caching_sha2_password,这是自 MySQL 8.0 以来的默认身份验证插件。也可以在部署期间通过 MySQL CLI 更新密码 - 但运行相同的配置是最轻松的 - 也是最可靠的测试。

Upgrading to MySQL 8.0 : Default Authentication Plugin Considerations详细解释。

【讨论】:

  • 我在生产服务器上没有选择,因为它是通过托管公司共享的。如果我愿意,我相信我可以切换到 7.X 版本之一,但不能切换到 7.4。我知道 mysql_native_password 并尝试过,但仍然无法连接,尽管目前尚不清楚问题是否相同:警告:mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 109 in /var/www/html /winelist.loc/db_test.php 第 32 行
  • @DonP 或者,您可以将开发环境降级到生产版本......这也很重要,在 MySQL 的内部用户表中将哪个插件分配给用户 - 结合服务器配置。这些必须相互匹配。运行不同的版本只会引入无用的复杂性,并且在某些情况下,难以重现问题。大多数共享主机 ISP 甚至强制升级到 PHP 7.x ...这导致了对程序员的需求。
  • Ubuntu 本身升级了 PHP,但我也更喜欢它是最新的,特别是如果我的托管公司可能随时决定强制 7.X,因为我预计他们很快就会,即使它是 7.2或 7.3。在 7.4 更新破坏了某些东西之前,所有网站都已更新并为这种可能性做好了准备。
  • @DonP 这更像是 MySQL 5.0 与 8.0 和 PHP mysqli 连接器不兼容,而不是 PHP 5.x 与 7.4 版本不兼容。你根本不能使用caching_sha2_password,而那里只支持mysql_native_password。 MySQL 8.0 的更新不仅涉及更改默认身份验证插件,还需要为每个用户分配的身份验证插件以及更新密码的值,以便它们一起工作(更新一半,这将被破坏)。
  • 谢谢,是的,我明白这一点,并且一定在您发表评论的同时发布了我的回答,其中提到了这些事情。此外,事实证明,我的托管公司允许我逐个站点更改 PHP 版本,并提供最高 7.3 的版本。不幸的是,我还没有能够启用它,因为显然 mysqli 和其他需要的模块一起丢失了,所以我正在等待他们添加这些东西。
【解决方案2】:

解决方案是简单地将数据库密码更改为可以使用的密码,方法是在终端中登录 mysql:

sudo mysql -p -u root

然后在 mysql> 提示符下运行每一个:

ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YOUR_PASSWORD';

FLUSH PRIVILEGES;

由于我的代码没有改变并且仍然使用与以前相同的密码,它应该可以在本地 PHP 7.4 和实时 5.X 上运行。不过,我不确定如何在实时服务器上执行此操作,因为我无权访问 mysql 表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2013-03-08
    • 2013-12-27
    相关资源
    最近更新 更多