错误2002“No such file or directory”表明PHP与MySQL的Unix socket连接失败,根源是socket路径不匹配或连接方式误用;应先验证MySQL服务状态和实际socket路径,再核对php.ini中mysqli.default_socket配置,最后确认host使用localhost(走socket)还是127.0.0.1(走TCP)及认证插件兼容性。

mysqli_connect() 报错 2002:No such file or directory 怎么快速定位
这不是 PHP 代码写错了,而是底层连接根本没建立起来。错误里出现 No such file or directory,基本可以断定是 Unix socket 路径不匹配 —— MySQL 服务启了,但 PHP 找不到它生成的 mysql.sock 文件。
先别改代码,直接在终端跑这三行:
mysql -u root -p
如果也报同样 2002 错误,说明问题出在 MySQL 自身配置;如果能连上,那问题就在 PHP 的连接参数或 php.ini 配置里。
- 查 MySQL 实际 sock 路径:
mysql --help | grep "socket"或登录后执行SHOW VARIABLES LIKE 'socket'; - 查 PHP 认为的 sock 路径:
php -i | grep "mysql.default_socket"(注意这个值可能为空,此时会 fallback 到编译默认路径) - 常见 mismatch 场景:MySQL 装在
/var/run/mysqld/mysqld.sock,而 PHP 默认找/tmp/mysql.sock
localhost 和 127.0.0.1 在 mysqli_connect() 中行为完全不同
localhost 不等于 127.0.0.1 —— 这是绝大多数人踩坑的第一步。MySQL 客户端对这两个值有硬编码逻辑:
立即学习“PHP免费学习笔记(深入)”;
-
localhost→ 强制走 Unix socket(无视 port 参数),路径由 MySQL 配置或 PHP 编译时决定 -
127.0.0.1→ 强制走 TCP/IP,走port参数(默认 3306),完全绕过 socket
所以当你看到 mysqli_connect('localhost', ...) 报 2002,最快验证方式就是改成:
mysqli_connect('127.0.0.1', 'root', 'pass', 'test', 3306);
如果连上了,说明 socket 路径不一致;如果还是失败,就得查服务状态、端口监听或防火墙了。
phpEnv 环境下 mysql.default_socket 配置容易被忽略
phpEnv 是多版本共存环境,每个 PHP 版本的 php.ini 是独立的,mysql.default_socket 很可能没配,或配错了路径。
打开当前生效的 php.ini(用 php --ini 查路径),搜索 mysql.default_socket,确认它和 MySQL 实际 sock 路径一致。例如:
mysql.default_socket = /var/run/mysqld/mysqld.sock
若该行被注释或值为空,PHP 就会用编译时的默认路径(通常是 /tmp/mysql.sock),而现代 MySQL 发行版几乎都不放那儿了。
- 改完记得重启 Web 服务(Apache/Nginx)或 php-fpm 进程
- Windows 下不走 socket,此配置无效;Linux/macOS 必须核对
- docker-compose 环境中,phpEnv 容器里填
localhost指的是容器自己,不是宿主机 —— 应该填 MySQL 容器名,如mysql
MySQL 8.0+ 和旧版 PHP 组合可能隐式触发 2002
这不是连接失败,而是认证阶段被中断后“伪装”成连接失败。MySQL 8.0 默认用 caching_sha2_password 插件,而 PHP 7.2 及更早版本的 mysqli 扩展根本不认识它,握手直接断开,错误就回退显示成 2002。
验证方式:用命令行 mysql -h 127.0.0.1 -u your_user -p 能连上,但 PHP 连不上,大概率是这个原因。
- 临时修复(开发机):
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 + port,且 host 严禁填
localhost
socket 路径、host 解析逻辑、认证插件兼容性 —— 这三者叠加时,2002 错误的表现高度相似,但根因完全不同。排查顺序永远是:服务状态 → 连接方式(socket/TCP)→ 配置路径一致性 → 认证机制兼容性。



















