10060错误本质是TCP连接超时,表明phpMyAdmin底层MySQL客户端在三次握手阶段失败,主因包括网络不通、MySQL未监听外网、防火墙或安全组未开放3306端口、配置IP或端口错误、用户host权限不匹配及认证插件兼容性问题。
phpMyAdmin 连远程 MySQL 时卡住或报 10060 错误
这不是 phpmyadmin 自身 bug,而是底层 mysqli_connect() 或 pdo::__construct() 在 tcp 三次握手阶段失败——根本没发 sql 就断了。典型表现是页面长时间转圈、浏览器报 err_connection_timed_out,或者错误信息里明确带 connection timed out。
必须按顺序排查:
- 用
telnet 192.168.5.100 3306(或nc -zv 192.168.5.100 3306)直连目标 IP 和端口,不通就不是 phpMyAdmin 的问题 - 确认 MySQL 配置中
bind-address不是127.0.0.1(得是0.0.0.0或具体外网 IP) - 检查目标服务器的系统防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确保 3306/tcp 已放行 - 云服务器必须额外检查安全组:阿里云/腾讯云/AWS 控制台里,入方向规则要显式添加
888/888(phpMyAdmin 自身端口)和3306/3306(MySQL 端口),二者独立 - 查
config.inc.php里的$cfg['Servers'][$i]['host']:别写容器内网 IP(如172.17.0.2),宿主机访问不到;也别写无法解析的内部域名(如db-prod.internal)
配置多服务器时 host/port/user 写错导致连接失败
phpMyAdmin 多服务器靠 config.inc.php 中的数组索引区分,比如 $cfg['Servers'][1]、$cfg['Servers'][2]。常见手误直接让某台服务器永远连不上。
重点核对三项:
-
$cfg['Servers'][$i]['host']:必须填目标 MySQL 实际可路由的 IP,不是localhost,也不是 Docker 宿主机上docker inspect出来的 bridge 网络地址 -
$cfg['Servers'][$i]['port']:如果 MySQL 容器映射到宿主机是-p 3307:3306,这里就得写'3307',不是默认'3306' -
$cfg['Servers'][$i]['user']对应的 MySQL 用户,其host字段必须匹配请求来源:若 phpMyAdmin 跑在203.123.45.67,用户就得是'username'@'203.123.45.67'或'username'@'%','username'@'localhost'无效
MySQL 服务端主动断连引发 “gone away” 类错误
连接建立成功,但隔几分钟操作就报 MySQL server has gone away 或 Lost connection to MySQL server during query,这是服务端主动 kill 掉空闲连接,和网络超时无关。
关键参数是 wait_timeout 和 interactive_timeout,默认 28800 秒(8 小时),但很多客户端(如 PHP 的 mysqli)走的是非交互模式,实际受 wait_timeout 控制。
解决方法分两层:
- MySQL 侧:执行
SET GLOBAL wait_timeout = 14400; SET GLOBAL interactive_timeout = 14400;,并写入my.cnf的[mysqld]段,避免重启失效 - phpMyAdmin 侧:它本身不维护连接池,但会复用 PHP-FPM 进程内的连接。需确保 PHP 层不因超时提前断开——检查
php.ini的max_execution_time(别设太小)和mysql.connect_timeout(建议 ≥30)
phpMyAdmin 自身加载慢拖累整体响应
首次访问卡 20 秒以上,页面空白或“正在加载”,大概率是它在后台调用 file_get_contents('https://www.phpmyadmin.net/home_page/version.json') 做版本检查——国内网络访问这个地址极不稳定,且无超时控制。
最有效解法是禁用该机制:
- 找到
version_check.php文件(路径类似/www/server/phpmyadmin/phpmyadmin_4xxx/libraries/version_check.php) - 备份后,在文件末尾(比如第 240 行附近
file_get_contents()调用之后)加一行exit;,或直接注释掉整个 HTTP 请求逻辑 - 不要只改
config.default.php里的$cfg['VersionCheck'],4.x 版本该开关已失效,必须动源码
这个点容易被忽略:即使网络通、MySQL 连得上、权限全开,只要 version_check.php 卡住,整个 phpMyAdmin 页面就挂起,而且错误日志里往往不报错,只能靠慢日志定位到 version_check.php 文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











