我参考以下问题: Php 脚本在“新 PDO”对象创建时挂起 这个问题已经被问了很长时间了,但我对 mysqlrouter 也有完全相同的问题。
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);
根帐户可以连接(如果我取消注释这些行...) 非 root 帐户不能。如果密码或权限错误,我会收到一条错误消息,但一旦登录参数正确,程序就会挂在新的 PDO 上。
环境:
php8.2没有出现这个问题但是我现在无法升级...
我尝试抑制选项。
进程上的 strace 显示与数据库的连接并在 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
在 mysqlrouter 端,同样的事情,一些对话并等待输入
[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 ...>
新的PDO没有返回
正如所说: php - new PDO() 和 new mysqli() 挂起,但 MySQL 显示连接
这是mysql中auth插件的问题: 使用 mysql_native_password 代替 caching_sha2_password 解决了问题...