phpmyadmin报错“mysqli_real_connect(): (hy000/2002): no such file or directory”是因mysql socket路径错误或未启用socket连接所致;需先查实际socket路径(show variables like 'socket'),再在config.inc.php中正确配置$cfg['servers'][$i]['socket'],或改用tcp连接(设host为'127.0.0.1'并注释socket行),同时确保mysql监听3306端口且网络可达。
phpmyadmin 报错 mysqli_real_connect(): (hy000/2002): no such file or directory 怎么办
这是典型的 unix socket 路径不对或 mysql 未启用 socket 连接导致的。phpmyadmin 默认走 /var/run/mysqld/mysqld.sock,但你的 mysql 实际 socket 文件可能在 /tmp/mysql.sock、/var/lib/mysql/mysql.sock,甚至压根没启 socket(比如某些 docker 镜像只开 tcp)。
- 先确认 MySQL 实际 socket 路径:
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';" - 再检查该路径是否存在且权限可读:
ls -l /path/from/above;若不存在,说明 MySQL 没启用 socket(常见于配置了skip-networking或bind-address = 127.0.0.1但没配socket) - phpMyAdmin 的配置入口是
config.inc.php,关键项是$cfg['Servers'][$i]['host']和$cfg['Servers'][$i]['socket']—— 不要只改host,socket 错误时必须同步指定socket
想让 phpMyAdmin 改用 TCP 连接(localhost:3306),但连不上
很多人以为把 $cfg['Servers'][$i]['host'] = 'localhost'; 改成 '127.0.0.1' 就行,其实不是。MySQL 对 localhost 有特殊处理:强制走 socket;而 127.0.0.1 才真正走 TCP。但前提是 MySQL 必须监听 TCP 端口。
- 检查 MySQL 是否监听 3306:
ss -tlnp | grep :3306或netstat -tlnp | grep :3306 - 如果没输出,说明
bind-address被设为127.0.0.1以外的值(比如::1或空),或配置了skip-networking—— 去/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或/etc/my.cnf(CentOS)里删掉这两项 - 改完重启 MySQL:
sudo systemctl restart mysql(或mariadb) - phpMyAdmin 中设
$cfg['Servers'][$i]['host'] = '127.0.0.1';,并**删掉或注释掉**$cfg['Servers'][$i]['socket']行(留着会优先走 socket)
docker 容器里跑 phpMyAdmin 连不上宿主机 MySQL
容器里的 localhost 指的是容器自己,不是宿主机。直接填 127.0.0.1 也连不到宿主机,因为 Docker 网络隔离。常见错误是照抄文档写 host.docker.internal,但它在 Linux 上默认不生效(仅 macOS/Windows Docker Desktop 支持)。
- Linux 下推荐方案:启动容器时加
--network=host,此时容器共享宿主机网络命名空间,127.0.0.1就是宿主机 - 更安全的做法是用宿主机真实 IP(如
192.168.x.x),但需确保 MySQL 允许该 IP 连接:CREATE USER 'pma'@'192.168.x.%' IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO 'pma'@'192.168.x.%'; FLUSH PRIVILEGES; - 别忘了开放宿主机防火墙(如
ufw allow 3306) - phpMyAdmin 配置中
$cfg['Servers'][$i]['host']填这个 IP,socket必须清空
MySQL 8.0+ 用 TCP 连接报错 Authentication plugin 'caching_sha2_password' cannot be loaded
这是 PHP 的 mysqli 扩展版本太老(mysqlnd 驱动导致的。MySQL 8.0 默认用 caching_sha2_password 认证插件,旧驱动不认识。
- 临时解决:降级用户认证方式(不推荐长期用):
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'yourpass'; FLUSH PRIVILEGES; - 根本解决:升级 PHP 到 7.4+,并确认
php -m | grep mysqli输出包含mysqlnd(不是mysqli单独一行) - 如果用的是 Alpine Linux 的 Docker 镜像,安装时得显式加
php-mysqli和php-mysqlnd包
socket 和 TCP 看似只是路径或地址的区别,但背后牵扯 MySQL 配置、PHP 驱动能力、Docker 网络模型三层逻辑。改一处不检查其他两处,大概率白忙活。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











