错误2002表示PHP无法连接MySQL服务,主因是地址/端口/服务状态不匹配;'localhost'走socket易失败,改用'127.0.0.1'强制TCP可快速验证;需确认mysqld运行、端口监听及Docker中正确使用服务名。

php mysqli_connect() 报错 2002:Can't connect to local MySQL server through socket
错误号 2002 表示 PHP 无法建立到 MySQL 服务的底层连接,本质是网络或服务可达性问题,不是 SQL 语法或权限问题。最常见原因是连接地址、端口、服务状态三者之一不匹配。
检查 mysqli_connect() 的 host 参数是否写错
很多开发者直接写 'localhost',但 MySQL 对这个值有特殊处理:它会优先尝试 Unix socket 连接(而非 TCP),而 socket 路径若不对或 mysqld 未配置,就会触发 2002。换成 '127.0.0.1' 强制走 TCP 是最快验证方式。
-
'localhost'→ 尝试 Unix socket(路径由 MySQL 配置socket项决定) -
'127.0.0.1'→ 强制 TCP,走port(默认 3306) - 远程地址如
'192.168.1.100'或域名也走 TCP,但需确认防火墙和 MySQL 的bind-address
mysqli_connect('127.0.0.1', 'root', 'pass', 'test', 3306); // 推荐先这样试
确认 MySQL 服务是否运行且监听正确端口
报 2002 时,先别调代码,直接在服务器终端验证 MySQL 是否真在跑、能否被访问:
- Linux/macOS:运行
systemctl status mysql或ps aux | grep mysqld - 检查监听:运行
netstat -tlnp | grep :3306,看是否有mysqld占用 - 如果只看到
127.0.0.1:3306,说明绑定了本地;若要外网连,需改 MySQL 配置bind-address = 0.0.0.0并重启 - Docker 环境常见坑:PHP 容器里用
localhost指的是 PHP 容器自身,不是 MySQL 容器 —— 应该用服务名如'mysql'(docker-compose.yml 中定义的)
PHP 和 MySQL 版本/配置不兼容导致隐式失败
较新版本 MySQL(8.0+)默认使用 caching_sha2_password 认证插件,而旧版 PHP(
立即学习“PHP免费学习笔记(深入)”;
- 临时解决:登录 MySQL,为用户切回兼容认证:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';
- 长期方案:升级 PHP 到 7.4+,或在 MySQL 配置中设
default_authentication_plugin = mysql_native_password - 注意:某些云数据库(如阿里云 RDS)禁用 socket 连接,必须用 IP + 端口,且
host不能填localhost











