我正在测试使用 Ubuntu Server 18.04 LTS、NGINX 1.14、PHP 7.2.8 和 MySQL 8.0.12 构建的新 LEMP Web 服务器。这是一个使用官方 Canonical AMI 的 AWS EC2 实例。除了数据库连接之外,Web 和 PHP 工作正常。但是我无法使用在其他情况下(MySQL 5.7 通过 PHP 7.1)运行良好的 PDO 设置和函数连接到 MySQL 数据库。
我可以使用与 PDO 尝试使用的相同凭据在终端中可靠地连接到服务器(通过 SSH 连接到 MySQL)。还可以使用 MySQL Workbench 和相同凭据从远程可靠地进行连接。服务器上没有防火墙。防火墙仅通过 Amazon 的安全组。在端口 3306 完全打开的情况下,PHP 仍然无法使用 PDO 进行连接。还没有尝试使用 MySQLi,但这样做的一个目的是确定并记录如何在此环境中通过 PDO 进行连接。所以这不是一个解决方案。
我知道 MySQL 8 的密码安全性有所改变(我在安装过程中选择使用新的更强的默认密码)。但我也得到了以下印象:http://php.net/manual/en/ref.pdo-mysql.php从 PHP 7.2.4 开始,这应该可以工作了...不过我真的不明白他们在相关段落中想要表达什么...
这难道还不能发挥作用吗?
编辑:删除了不相关的配置和故障排除信息。希望这个更简洁/更简短的问题编辑对后来发现它的人更有用。
答案1
进一步调查后我们发现 PHP 尚不支持 caching_sha2_authentication,mysql 必须恢复为本机。
笔记:不能简单地创建帐户WITH mysql_native_password
,而必须将默认值设置为mysql_native_password。
编辑:删去与问题无关的信息。
答案2
您链接到的 PHP 文档页面上的文本是:
MySQL 8
运行 7.1.16 之前的 PHP 版本或 7.2.4 之前的 PHP 7.2 时,将 MySQL 8 Server 的默认密码插件设置为mysql_native_password否则你会看到类似以下的错误服务器请求客户端未知的身份验证方法 [caching_sha2_password]即使不使用 caching_sha2_password。
这是因为 MySQL 8 默认使用 caching_sha2_password,这是旧版 PHP (mysqlnd) 无法识别的插件。相反,可以通过设置来更改它default_authentication_plugin=mysql_native_password在 my.cnf 中。缓存_sha2_密码插件将在未来的 PHP 版本中得到支持。与此同时,mysql_xdevapi扩展确实支持它。
这并不意味着 PHP 目前支持 caching_sha2_password。它不支持。这意味着当连接到宣称支持 caching_sha2_password 的 MySQL 8.0 服务器时,PHP 不再会抛出致命错误。
如果愿意,您可以安装命名的 PECL 扩展,但它具有与 mysqlnd 不同的 API,因此它不是直接替代品,并且不能与使用 mysqlnd 的 API 的现有 PHP 代码一起使用。
目前,直到发布真正支持使用 caching_sha2_password 进行身份验证的 PHP mysqlnd 新版本之前,您唯一的选择就是不使用它,而是按照文档中的说明返回到 mysql_native_password。