连接数据库报错:“SQLSTATE[HY000] [2002] No such file or director” 的解决办法
一、首选快速方案:修改数据库连接配置
- 将主机名从
localhost
改为127.0.0.1
- 原因:
localhost
会尝试通过 Unix socket 文件连接,而127.0.0.1
强制使用 TCP/IP 协议,避免 socket 文件依赖问题23。 - 操作位置:
// 数据库配置文件(如 database.php) 'host' => '127.0.0.1', // 替换原 'localhost'
- 原因:
二、检查并修复 PHP 配置(若方案一无效)
-
定位 MySQL 的 socket 文件路径
- 执行命令查找:
ps aux | grep mysql # 查找类似 /tmp/mysql.sock 的路径 sudo find / -name mysqld.sock # 全局搜索文件
- 常见路径:
/tmp/mysql.sock
、/var/run/mysqld/mysqld.sock
。
- 执行命令查找:
-
修改
php.ini
中的 socket 配置- 找到并编辑
php.ini
(路径通过phpinfo()
确认) - 修改以下三项(根据实际路径):
mysql.default_socket = /tmp/mysql.sock mysqli.default_socket = /tmp/mysql.sock pdo_mysql.default_socket = /tmp/mysql.sock
- 若缺少
php.ini
,复制默认配置:sudo cp /etc/php.ini.default /etc/php.ini ```:ml-citation{ref="5,8" data="citationList"}。
- 找到并编辑
-
重启 Web 服务
- Apache:
sudo systemctl restart apache
- Nginx + PHP-FPM:
sudo systemctl restart php-fpm
。
- Apache:
三、检查 MySQL 服务与防火墙
-
确认 MySQL 服务运行状态
sudo systemctl status mysql # 确保服务为 active (running)
-
调整 MySQL 绑定地址
- 编辑 MySQL 配置文件(
my.cnf
或my.ini
):[mysqld] bind-address = 0.0.0.0 # 允许所有 IP 连接
- 重启 MySQL:
sudo systemctl restart mysql
。
- 编辑 MySQL 配置文件(
-
检查防火墙规则
- 开放 3306 端口:
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload ```:ml-citation{ref="2" data="citationList"}。
- 开放 3306 端口:
四、其他注意事项
- PHP 扩展缺失:通过
phpinfo()
确认pdo_mysql
或mysqli
扩展已启用。 - 文件权限问题:确保 PHP 进程用户有权限读取
mysql.sock
文件(如chmod 777 /tmp/mysql.sock
临时测试)。