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
相关产品推荐
相关产品推荐

