10060错误本质是tcp连接超时,表明phpmyadmin底层mysql客户端在三次握手阶段失败,主因包括网络不通、mysql未监听外网(bind-address限制)、系统/云防火墙或安全组未开放3306端口、phpmyadmin配置ip或端口错误、mysql用户host权限不匹配,以及认证插件兼容性问题。
10060 错误本质是 tcp 连接超时,不是 phpmyadmin 自身报错,而是它底层用的 mysql 客户端连接失败后透出的系统级网络错误。只要 phpmyadmin 尝试连远程 mysql 时卡在建连阶段(还没发 sql),就大概率是这个错。
mysqli_connect() 或 PDO::__construct() 底层直接失败
phpMyAdmin 启动连接时会调用 PHP 的 MySQL 扩展函数,比如 mysqli_connect()。一旦该函数返回 false,且 mysqli_connect_error() 显示类似 Connection timed out,对应操作系统 errno 就是 10060(Windows)或 110(Linux)。这说明:
- PHP 进程根本没收到服务器 SYN-ACK 响应
- 连接在三次握手阶段就中断了
常见诱因包括:
- phpMyAdmin 所在机器到目标 MySQL IP 的路由不通(中间有丢包、NAT 失效、跳数超限)
- 目标服务器上 MySQL 服务压根没监听对外网卡(
bind-address = 127.0.0.1未注释) - 目标服务器防火墙(
ufw/firewalld/iptables)默认 DROP 了入向3306/tcp - 云服务商安全组(如阿里云、腾讯云、AWS)没放行
3306端口,且规则优先级高于系统防火墙
config.inc.php 中 $cfg['Servers'][$i]['host'] 配置错误
phpMyAdmin 多服务器配置依赖 config.inc.php 里的数组项,比如:
$cfg['Servers'][1]['host'] = '192.168.5.100'; $cfg['Servers'][1]['port'] = '3306'; $cfg['Servers'][1]['auth_type'] = 'cookie';
容易踩的坑:
- 写成域名但 DNS 不可达(例如
db-prod.internal在本地网络无解析) - 混淆了容器内网 IP 和宿主机可访问 IP(Docker 环境下常把
172.17.0.2直接填进 phpMyAdmin 配置,而宿主机根本 ping 不通这个地址) -
port写错(MySQL 容器映射到宿主机是3307,但配置里仍写3306) - 开启了 SSH 隧道但
ssh连接本身失败,导致隧道未建立,phpMyAdmin 仍试图直连原始 IP
MySQL 用户 host 字段值为 localhost 或具体 IP,不匹配请求来源
即使网络和防火墙都通,phpMyAdmin 发起的连接也会被 MySQL 服务端拒绝——如果用户权限只允许从特定 host 连入。
登录目标 MySQL 执行:
SELECT host, user FROM mysql.user WHERE user = 'pma_user';
若结果中 host 是 localhost,那任何远程 IP(包括 phpMyAdmin 所在服务器)都会被拒。必须改成:
-
'%'(任意 host,慎用) - 或具体子网段,如
'192.168.10.%' - 或精确 IP,如
'192.168.1.100'(即 phpMyAdmin 服务器出口 IP)
改完别忘:
FLUSH PRIVILEGES;- 确保没漏掉
authentication_plugin兼容问题(MySQL 8.0+ 默认caching_sha2_password,旧版 PHP 扩展可能不支持,此时会静默失败,但错误码仍是10060表象)
真正卡住人的地方往往不在 MySQL 配置本身,而在“你以为通的链路其实断在第三层”。比如:你确认了云服务器安全组开了 3306,却忘了它背后还套了一层企业级防火墙;你 telnet ip 3306 成功,但 phpMyAdmin 实际走的是 IPv6 地址而你只放行了 IPv4 端口;或者你在本地开发机配了代理,导致 phpMyAdmin 的 HTTP 请求能发出去,但底层 MySQL 连接被代理策略拦截。排查时得一层层剥开,不能只盯 my.cnf。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











