错误本质是PHP无法建立MySQL底层连接,需同步确认MySQL服务状态、网络可达性、phpMyAdmin配置及PHP扩展socket参数四者一致。
mysqli_real_connect(): (hy000/2002) 错误本质是 php 无法建立到 mysql 的底层连接,不是密码错、也不是用户权限问题,而是连接通道根本没通。绝大多数情况只需两步:确认 mysql 是否在跑,再让 phpmyadmin 走对的路(socket 还是 tcp)。
先确认 MySQL 服务是否真的运行着
很多人跳过这步直接改配置,结果白忙活。用命令实测:
-
systemctl is-active mysql(Ubuntu/Debian)或systemctl is-active mariadb(CentOS/RHEL),返回active才算真 running - 如果返回
inactive或报错,先启动:sudo systemctl start mysql - Docker 环境要特别注意:
localhost指的是 phpMyAdmin 容器自身,不是宿主机或另一个 MySQL 容器——得填 MySQL 容器名(如mysql)或宿主机 IP(如172.17.0.1)
区分 localhost 和 127.0.0.1:MySQL 的“本地”有玄机
MySQL 对 localhost 有硬编码逻辑:强制走 Unix socket;而 127.0.0.1 才真正走 TCP/IP。所以光改 $cfg['Servers'][$i]['host'] = 'localhost' 没用。
- 想切 TCP 连接:把
$cfg['Servers'][$i]['host']设为'127.0.0.1',同时必须删掉或注释掉同级的$cfg['Servers'][$i]['socket']行(留着它会优先抢连 socket) - 检查 MySQL 是否监听 3306:
ss -tlnp | grep :3306。没输出?说明bind-address被设成::1、空值,或开了skip-networking——去/etc/mysql/mysql.conf.d/mysqld.cnf里干掉这两项,再sudo systemctl restart mysql
查准 socket 路径再配,别硬套默认值
phpMyAdmin 默认猜 /var/run/mysqld/mysqld.sock,但实际路径五花八门:/tmp/mysql.sock、/var/lib/mysql/mysql.sock,甚至 Docker 镜像压根不生成 socket 文件。
- 登录 MySQL 执行:
SHOW VARIABLES LIKE 'socket';,拿到真实路径 - 用
ls -l /path/from/above确认文件存在且 PHP 进程可读(权限常是mysql:mysql,PHP 用户得在mysql组里) - 若路径正确但还是报错,检查 phpMyAdmin 的
config.inc.php中$cfg['Servers'][$i]['socket']是否拼写错误,路径是否漏了/开头
php.ini 级别的 socket 设置容易被忽略
有些环境(尤其是编译安装或容器)中,PHP 自身的 mysqli/pdo_mysql 扩展也依赖 php.ini 里指定 socket,和 phpMyAdmin 配置无关。
立即学习“PHP免费学习笔记(深入)”;
- 找到生效的
php.ini(php --ini查路径),检查是否有: mysqli.default_socket = /var/lib/mysql/mysql.sockpdo_mysql.default_socket = /var/lib/mysql/mysql.sock- 路径必须和
SHOW VARIABLES LIKE 'socket'输出一致,改完重启 PHP-FPM 或 Apache
关键点在于:这个错误从来不是单一配置项的问题,而是 MySQL 服务状态、网络层可达性、phpMyAdmin 配置、PHP 扩展参数 四者必须全部对齐。最容易卡住的地方是——以为改了 host 就够了,却忘了 socket 行还在那儿强行接管连接。



















