提问人:Jerry 提问时间:4/11/2023 最后编辑:DharmanJerry 更新时间:4/11/2023 访问量:207
php - 新的 PDO() 和新的 mysqli() 挂起,但 MySQL 显示连接
php - new PDO() and new mysqli() hanging, but MySQL shows connection
问:
在以下代码中,对 never 的调用将返回:new PDO()
try {
$dsn = 'mysql:host=mycluster;port=3306;dbname=mydb;charset=UTF8';
// Trying various options to resolve potential communication issues. These had
// no effect, but are retained so we can eliminate them.
$options = [
PDO::MYSQL_ATTER_INIT_COMMAND => "SET NAMES 'UTF8'",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
$pdo = new PDO($dsn, 'user', 'password', $options);
print "\ncreated new PDO!"; // <-- never reaches here
} catch (Exception $e) {
print $e->getMessage(); // <-- never reaches here
}
print "\n\nFinished!\n"; // <-- never reaches here
有趣的是,如果我使用在同一环境中运行的 mysql 客户端,我可以使用相同的凭据进行连接。
更有趣的是,当我在MySQL中时,我看到了以前尝试连接的残余:show processlist
+--------+---------------+-------------------+----------+-----------------+--------+---------------+----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------------------+-------------------+----------+-----------------+--------+---------------+----------------------------------+
| 373936 | user | 240.16.7.14:47544 | mydb | Sleep | 1575 | | NULL |
| 377508 | user | 240.16.7.14:37742 | mydb | Sleep | 37 | | NULL |
+------------------------+-------------------+----------+-----------------+--------+---------------+----------------------------------+
这告诉我正在建立连接,一方或另一方正在等待某事。您可以在上面看到我试图让 PDO 和 mysql 成为朋友的一些尝试,但这些尝试都没有成功。
这是迁移到新环境的一部分,代码在以前的环境(也是容器化的)中运行没有问题,但使用旧版本的 php 和 MySQL。
MySQL Innodb 集群版本 8.0.32
PHP 版本 8.1.17
如果我尝试连接,然后杀死mysql中的进程,将返回而不会出现错误。这似乎证实了正在等待服务器的某种响应。new PDO()
new PDO()
在我终止 php 进程之前,mysql 日志不显示任何内容,此时它显示 - bot to iterate,在我终止 php 进程之前没有消息。...[Note] [MY-010914] [Server] Aborted connection 392961 to db: 'mydb' user: 'user' host: '240.16.7.14' (Got an error reading communication packets).
SHOW GLOBAL STATUS LIKE "aborted_%";
产生一个可能没有用处的尝试(有很多尝试正在进行中,其中大部分来自其他代码):
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 20 |
| Aborted_connects | 10428 |
+------------------+-------+
我现在已经能够确认当我尝试使用 和 .mysqli
PDO
设置 docker 映像后,我可以使用 x 协议成功连接和执行查询。但是,当我尝试关闭连接时,它会冻结:
$session = mysql_xdevapi\getSession('mysqlx://user:password@mycluster');
$session->sql('USE mydb')->execute();
$rows = $session->sql('SELECT * FROM `my_table` where `id` < 10')->execute();
var_dump($rows->fetchAll()); // <-- lots of yummy data
$session->close(); // <-- hangs here (does not throw)
print "complete!" // <-- never reaches here
但从好的方面来说,查询是有效的!肯定有一些奇怪的行为(也挂了),但我不确定它是否值得跟踪。die
然而,这方面的文档几乎不存在。有些功能还没有实现,而且通常是一团糟。执行此操作时,日志中没有任何内容。
答:
好吧,我有一个答案,但我当然希望这不是答案。
尽管使用了 php 8.2,尽管 auth 在上面明显成功,尽管在 auth 失败时出现不同的错误,尽管看到 中列出的 ,将服务器上的用户帐户更改为使用 解决了问题。auth_plugin_caching_sha2_password
phpinfo()
mysql_native_password
评论