You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中new PDO()与new mysqli()连接MySQL时挂起问题求助

PHP连接MySQL InnoDB Cluster时出现挂起问题

调用new PDO()始终无法返回,代码示例如下:

try {
    $dsn = 'mysql:host=mycluster;port=3306;dbname=mydb;charset=UTF8';

    // 尝试多种选项解决潜在通信问题,无效果但保留以排除可能性
    $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!";    // <-- 永远无法执行到此处
} catch (Exception $e) {
    print $e->getMessage();        // <-- 永远无法执行到此处
}

print "\n\nFinished!\n";           // <-- 永远无法执行到此处

异常现象

  • 同一环境下使用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                             |
+------------------------+-------------------+----------+-----------------+--------+---------------+----------------------------------+

环境背景

此问题发生在迁移至新环境后,旧容器化环境(PHP和MySQL版本更旧)中代码运行正常。当前环境版本:

  • MySQL Innodb Cluster 8.0.32
  • PHP 8.1.17

进一步测试细节

  • 若在MySQL中终止挂起的连接进程,new PDO()会无错误返回,确认PHP端在等待服务器响应
  • MySQL日志在终止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连接时存在相同问题

X协议测试情况

搭建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());     // <-- 可获取数据
$session->close();               // <-- 在此处挂起(无报错)
print "complete!"                // <-- 永远无法执行到此处

虽查询正常,但存在异常行为(调用die也会挂起),且相关文档缺失、部分函数未实现,执行时无日志记录。

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:25:00