php - 新的 PDO() 和新的 mysqli() 挂起,但 MySQL 显示连接

php - new PDO() and new mysqli() hanging, but MySQL shows connection

提问人:Jerry 提问时间:4/11/2023 最后编辑:DharmanJerry 更新时间:4/11/2023 访问量:207

问:

在以下代码中,对 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 |
+------------------+-------+

我现在已经能够确认当我尝试使用 和 .mysqliPDO

设置 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 mysql mysqli pdo

评论

0赞 Wilson Hauck 4/11/2023
SHOW GLOBAL STATUS LIKE “aborted_%”的结果是什么?
0赞 Wilson Hauck 4/11/2023
选择@@log_error;以确定错误日志文件名,并查看是否有任何消息与您尝试连接有关。可能是权限问题或任何其他细节。
0赞 Jerry 4/11/2023
权限似乎不太可能,因为我可以使用相同的凭据从命令行从同一 VM 进行连接,并在同一数据库上执行任务。
0赞 Jerry 4/11/2023
也尝试过PHP 8.2.4
0赞 Chris Haas 4/11/2023
你有没有在这里尝试过任何解决方案?dba.stackexchange.com/a/19139/8542

答:

0赞 Jerry 4/11/2023 #1

好吧,我有一个答案,但我当然希望这不是答案。

尽管使用了 php 8.2,尽管 auth 在上面明显成功,尽管在 auth 失败时出现不同的错误,尽管看到 中列出的 ,将服务器上的用户帐户更改为使用 解决了问题。auth_plugin_caching_sha2_passwordphpinfo()mysql_native_password

评论

0赞 Wilson Hauck 4/11/2023
祝贺。
0赞 Your Common Sense 10/13/2023
您的 PDO libmysql 是基于 mysqlnd 的吗?