一尘不染

mysqli :: mysqli():(HY000 / 2002):无法通过套接字'MySQL'连接到本地MySQL服务器(2)

mysql

当我尝试使用php mysqli类连接到mysql数据库时,出现此错误。使用以下代码:

$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
    echo "An error occured. Please try again later.";
    exit();
}

为了安全起见,密码为*。

我创建kamil了对外部IP地址和本地主机具有所有特权的用户。当我运行时:select user,host from mysql.user它会正确显示这两个用户。

我进行了一些研究,并使用此基准测试:https :
//stackoverflow.com/a/2183134/1839439来查看它所连接的内容。事实证明它是唯一能够连接到127.0.0.1127.0.0.1:3306其为localhost,但是当我提供localhost它抛出了这个错误。

我的问题是为什么它只允许我使用本地主机ip地址而不是名称或外部ip连接到数据库。如果要在网站上使用mysql还是可以使用mysql,是否需要其他主机127.0.0.1

编辑:
hosts文件

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi

此用户的Mysql用户表结果:

| kamil            | 109.255.177.28 |
| kamil            | localhost      |

阅读 331

收藏
2020-05-17

共1个答案

一尘不染

当您仅使用“ localhost”时,MySQL客户端库将尝试使用Unix域套接字进行连接,而不是TCP /
IP连接。该错误告诉您,名为的套接字MySQL无法用于建立连接,可能是因为该套接字不存在(错误编号2)。

MySQL文档

在Unix上,MySQL程序特别对待主机名localhost,与其他基于网络的程序相比,它可能与您期望的不同。为了连接到本地主机,MySQL程序尝试使用Unix套接字文件连接到本地服务器。即使给
–port或-P选项指定端口号,也会发生这种情况。为确保客户端与本地服务器建立TCP / IP连接,请使用–host或-
h指定主机名值127.0.0.1,或本地服务器的IP地址或名称。您也可以使用–protocol =
TCP选项来显式指定连接协议,即使是本地主机也是如此。

有几种方法可以解决此问题。

  1. 您可以只使用TCP / IP而不是Unix套接字。您可以通过使用127.0.0.1代替localhost连接时进行此操作。但是,Unix套接字使用起来可能更快,更安全。
  2. 您可以在以下位置更改套接字php.ini:打开MySQL配置文件my.cnf以查找MySQL在何处创建套接字,并将PHP设置mysqli.default_socket为该路径。在我的系统上是/var/run/mysqld/mysqld.sock
  3. 打开连接时,直接在PHP脚本中配置套接字。例如:
    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                              '/var/run/mysqld/mysqld.sock')
    
2020-05-17