php8 mysql8 caching_sha2_password?

mysql8 默认使用 caching_sha2_password 方式
PHP8 已经支持 但是安装完 phpinfo 并没有找到 caching_sha2_password
源码安装命令

./configure --prefix=/usr/local/php-8.3.9 --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --enable-opcache=no
make && make install

是缺少了什么选项 还是 安装完需要修改什么配置呢
查了一天没查到,AI也没给个靠谱的方案
谢谢各位

阅读 1.2k
avatarAI BotBETA

在PHP 8中,即使你已经使用了支持MySQL Native Driver (mysqlnd) 的配置选项来编译PHP,caching_sha2_password的支持通常是通过mysqlnd本身自动处理的,而不需要额外的编译选项。caching_sha2_password是MySQL 8的默认认证插件,它应该与正确配置的mysqlnd一起工作。

如果你发现phpinfo()没有显示caching_sha2_password相关的条目,这可能是因为几个原因:

  1. MySQL扩展未启用:确保你的php.ini文件中有extension=mysqli.so(或extension=php_mysqli.dll在Windows上)和extension=pdo_mysql.so(或相应的DLL文件)启用。
  2. PHP配置未正确加载:检查php.ini文件的路径是否正确,并且确保重启了Web服务器(如Apache或Nginx)和PHP-FPM(如果你使用的是它)以应用更改。
  3. mysqlnd版本:确保你的PHP版本内置的mysqlnd支持MySQL 8。虽然PHP 8应该支持,但最好还是确认一下。
  4. 连接问题:如果PHP能够连接到MySQL但只是不显示认证方式,可能是因为连接时使用的用户名和密码不是通过caching_sha2_password插件认证的,或者MySQL服务器被配置为使用其他认证插件。
  5. 查看错误日志:检查PHP和MySQL的错误日志,看是否有任何相关的错误信息。
  6. 测试连接:编写一个简单的PHP脚本来测试MySQL连接,看是否成功,并检查是否有任何错误或警告被抛出。
  7. 更新或重新编译PHP:如果你怀疑PHP的编译过程有问题,你可以尝试重新编译PHP,确保所有相关的依赖项都是最新的,并且没有遗漏任何重要的配置选项。
  8. 检查MySQL服务器配置:确保MySQL服务器配置允许使用caching_sha2_password。你可以通过查看MySQL的user表来检查用户的认证插件。

如果你已经检查了上述所有方面并且仍然遇到问题,你可以尝试以下步骤来进一步调试:

  • 在PHP脚本中使用mysqli_connect()PDO::__construct()时添加错误处理,以获取更详细的错误信息。
  • 在MySQL服务器上尝试使用其他认证插件的用户来连接,看看是否有问题。
  • 查阅PHP和MySQL的官方文档或社区论坛,看看是否有其他人遇到了类似的问题。

最后,请注意,phpinfo()并不总是显示所有可能的MySQL认证插件。它主要显示PHP配置和已加载的扩展信息。要确认PHP是否支持caching_sha2_password,最好的方法是尝试使用它进行连接,并查看是否成功。

1 个回答

试了一下,安装一下 openssl-devel,然后在 configure 参数上加上 --with-openssl 就好了

镜像:dokken/centos-stream-9

$ cat /etc/os-release
NAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="9"
PLATFORM_ID="platform:el9"
PRETTY_NAME="CentOS Stream 9"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:centos:centos:9"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://issues.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"

$ yum install openssl-devel
$ ./configure --prefix=/usr/local/php-8.3.9 --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --enable-opcache=no --with-openssl
$ make && make install
$ /usr/local/php-8.3.9/bin/php -i | grep "Loaded plugins"
Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_caching_sha2_password,auth_plugin_sha256_password

参考:252420 – 'caching_sha2_password' support missing in PHP port, limits MySQL 8 compatibility


验证

以下代码来自 ChatGPT

-- 创建使用 caching_sha2_password 认证的用户
CREATE USER 'docker_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'your_password';

-- 授权用户对所有数据库的访问权限
GRANT ALL PRIVILEGES ON *.* TO 'docker_user'@'%' WITH GRANT OPTION;

image.png

<?php
$host = 'host.docker.internal';  // Docker 中访问主机的特殊 DNS 名称
$db = 'test';
$user = 'docker_user';
$pass = 'your_password';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo "Connected successfully!";
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏