PHP7.4通过MySQL Router创建PDO对象时非root账号连接挂起
PHP脚本通过MySQL Router创建PDO对象时无响应挂起
参考Stack Overflow问题《Php script hangs at "new PDO" object creation》,遇到完全一致的问题:通过MySQL Router连接MySQL时,PHP脚本执行到new PDO语句会无错误、无日志地挂起。
具体现象:
- 使用root账号可正常建立连接
- 使用非root账号时,若登录参数正确,程序卡在
new PDO语句处;若密码或权限错误,会正常返回错误信息 - 该问题在PHP8.2中不存在,但当前无法升级PHP版本
- 已尝试移除PDO连接选项,问题依旧存在
测试代码
<?php $dsn = "mysql:host=127.0.0.1;port=6446;dbname=XXXXXX;charset:utf8;"; $user = "nonrootaccount"; $password = "xxxxxxxxxxxxx"; //$user = 'root'; //$password = 'xxxxxxxxxx'; $options = [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::MYSQL_ATTR_COMPRESS => false, ]; $pdo = new PDO($dsn, (string) $user, (string) $password, (array) $options);
环境信息
- PHP 7.4
- MySQL Router 版本 8.0.34-0ubuntu0.20.04.1
- MySQL Server 版本 8.0.27 MySQL Community Server
strace进程日志(PHP端)
PHP进程连接后卡在poll系统调用,处于等待输入状态:
connect(3, {sa_family=AF_INET, sin_port=htons(6446), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 10000) = 1 ([{fd=3, revents=POLLOUT}]) getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 fcntl(3, F_SETFL, O_RDWR) = 0 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0 setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 86400000) = 1 ([{fd=3, revents=POLLIN}]) recvfrom(3, "J\0\0\0\n8.0.27\0\24\266u\2;%p#\36H5\17\0\337\377\377\2\0\377\323"..., 32768, MSG_DONTWAIT, NULL, NULL) = 78 sendto(3, "\230\0\0\1\215\242\33\0\0\0\0\300\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 156, MSG_DONTWAIT, NULL, 0) = 156 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 86400000) = 1 ([{fd=3, revents=POLLIN}]) recvfrom(3, "\7\0\0\2\0\0\0\2\0\0\0", 32768, MSG_DONTWAIT, NULL, NULL) = 11 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 86400000
MySQL Router端日志
Router在交互后同样处于等待输入状态:
[pid 1693032] recvmsg(62, <unfinished ...> [pid 1693032] <... recvmsg resumed>{msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\2\0\0\2\1\3\7\0\0\3\0\0\0\2\0\0\0", iov_len=16384}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 17 [pid 1693032] sendmsg(34, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\7\0\0\2\0\0\0\2\0\0\0", iov_len=11}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0 <unfinished ...> [pid 1693032] <... sendmsg resumed>) = 11 [pid 1693032] epoll_ctl(8, EPOLL_CTL_ADD, 34, {EPOLLIN|EPOLLONESHOT|EPOLLET, {u32=34, u64=34}} <unfinished ...> [pid 1693032] <... epoll_ctl resumed>) = 0 [pid 1693032] epoll_ctl(8, EPOLL_CTL_ADD, 62, {EPOLLIN|EPOLLONESHOT|EPOLLET, {u32=62, u64=62}} <unfinished ...> [pid 1693032] <... epoll_ctl resumed>) = 0 [pid 1693032] epoll_wait(8, <unfinished ...>
new PDO语句始终无法返回,程序持续挂起。
内容的提问来源于stack exchange,提问作者Bruno Marmol
相关产品推荐
相关产品推荐

