PHP 7.4 与 MySQL 8.0 之间的权限认证问题通常是由于 MySQL 8.0 引入了新的默认身份验证插件 (caching_sha2_password
) 和 PHP 7.4 使用的旧有 MySQL 客户端库(mysqlnd
或 mysqli
)不兼容所导致的。
MySQL 8.0 默认使用 caching_sha2_password
身份验证插件,而 PHP 7.4 默认的 MySQL 客户端(如 mysqlnd
)可能不支持此认证方法。为了避免身份验证问题,你可以采取以下解决方案。
解决方案 1:修改 MySQL 用户的认证插件
最直接的解决方法是将 MySQL 8.0 中的用户认证插件改回 mysql_native_password
,它是兼容 PHP 7.4 的旧版认证方式。
步骤:
- 登录到 MySQL 服务器:
mysql -u root -p
- 修改 MySQL 用户的认证插件,假设你使用的用户名是
your_user
:ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
如果你在远程访问数据库,可以将
localhost
替换为%
或相应的主机名:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 刷新权限:
FLUSH PRIVILEGES;
- 退出 MySQL:
exit;
解决方案 2:使用 MySQL 8.0 默认的 caching_sha2_password
插件
如果你不希望更改 MySQL 用户的认证插件,并且希望在 PHP 中支持 caching_sha2_password
,你需要确保 PHP 使用的是支持此认证方式的 MySQL 客户端。
步骤:
- 更新 PHP 的 MySQL 客户端库:
确保你使用的 PHP 版本已经安装并启用了mysqlnd
扩展,并且支持 MySQL 8.0 的caching_sha2_password
插件。在某些情况下,PHP 7.4 默认的
mysqlnd
版本可能无法正确处理 MySQL 8.0 的新认证方式。你可以尝试升级 PHP 和mysqlnd
。如果你使用的是 Ubuntu 或 Debian 系统,可以执行以下命令来升级相关包:
sudo apt-get update sudo apt-get install php7.4-mysql sudo apt-get upgrade php7.4-mysql
- 检查
mysqlnd
是否启用:
在 PHP 中,确保mysqlnd
扩展已启用。在php.ini
文件中检查是否启用了mysqlnd
。你可以通过以下命令检查是否安装了
mysqlnd
:php -m | grep mysqlnd
- 确认 PHP 支持
caching_sha2_password
:
如果 PHP 7.4 的mysqlnd
扩展版本较低,可以考虑升级到支持caching_sha2_password
插件的版本(PHP 7.4 及更高版本的mysqlnd
通常已经支持)。
解决方案 3:更新 PHP 和 MySQL 配置
有时候,PHP 和 MySQL 之间的权限认证问题可能与配置文件中的设置有关。如果你使用的是 Apache 或 Nginx 等 Web 服务器,确保以下设置已正确配置。
- 在 MySQL 配置文件中启用
mysql_native_password
插件:
如果你不想更改每个用户的身份验证插件,可以在 MySQL 配置文件中启用mysql_native_password
插件:编辑
/etc/my.cnf
或/etc/mysql/my.cnf
文件,添加以下行:[mysqld] default_authentication_plugin=mysql_native_password
然后重新启动 MySQL 服务:
sudo systemctl restart mysql
- 确保 MySQL 服务版本和客户端兼容:
确保 PHP 7.4 使用的 MySQL 客户端与 MySQL 8.0 兼容。如果 PHP 使用的 MySQL 客户端版本过旧,也会导致认证问题。
解决方案 4:检查 PHP 配置和 MySQL 连接代码
确保 PHP 代码中使用正确的 MySQL 连接方式,并且相关的连接设置已正确配置。
例如,在 PHP 中使用 mysqli
扩展时,确保使用正确的主机名、用户名和密码:
$mysqli = new mysqli('localhost', 'your_user', 'your_password', 'your_database');
// 检查连接是否成功
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
总结
- 修改 MySQL 用户认证插件:将用户的认证插件更改为
mysql_native_password
,以确保与 PHP 7.4 兼容。 - 升级 PHP 和 MySQL 客户端:确保 PHP 使用支持 MySQL 8.0
caching_sha2_password
插件的mysqlnd
扩展。 - 更新 MySQL 配置:在 MySQL 配置文件中设置默认认证插件为
mysql_native_password
,以确保兼容性。 - 检查 PHP 连接代码:确保 PHP 使用正确的连接方式,并且相关配置没有问题。
这些解决方案可以帮助你解决 PHP 7.4 与 MySQL 8.0 之间的认证问题。如果问题仍然存在,可能需要考虑升级 PHP 到更高版本,或进一步调试数据库和应用程序的连接设置。