连接数据库报错:“SQLSTATE[HY000] [2002] No such file or director” 的解决办法

一、首选快速方案:修改数据库连接配置

  1. 将主机名从 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 配置(若方案一无效)

  1. 定位 MySQL 的 socket 文件路径

    • 执行命令查找:
      ps aux | grep mysql # 查找类似 /tmp/mysql.sock 的路径 sudo find / -name mysqld.sock # 全局搜索文件
    • 常见路径:/tmp/mysql.sock/var/run/mysqld/mysqld.sock
  2. 修改 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"}。
  3. 重启 Web 服务

    • Apache: sudo systemctl restart apache
    • Nginx + PHP-FPM: sudo systemctl restart php-fpm

 三、检查 MySQL 服务与防火墙

  1. 确认 MySQL 服务运行状态

    sudo systemctl status mysql # 确保服务为 active (running)
  2. 调整 MySQL 绑定地址

    • 编辑 MySQL 配置文件(my.cnf 或 my.ini):
      [mysqld] bind-address = 0.0.0.0 # 允许所有 IP 连接
    • 重启 MySQL:sudo systemctl restart mysql
  3. 检查防火墙规则

    • 开放 3306 端口:
      sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload ```:ml-citation{ref="2" data="citationList"}。

 四、其他注意事项

  • PHP 扩展缺失‌:通过 phpinfo() 确认 pdo_mysql 或 mysqli 扩展已启用。
  • 文件权限问题‌:确保 PHP 进程用户有权限读取 mysql.sock 文件(如 chmod 777 /tmp/mysql.sock 临时测试)。