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

2022-08-30 13:18:53

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

$db = new MySQLi("localhost","kamil","*****");

密码是 * 为了安全。

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

我做了一些研究并使用了这个基准:https://stackoverflow.com/a/2183134/1839439 看看它连接到什么。事实证明,它只能连接到本地主机,但是当我提供它时,它会抛出此错误。127.0.0.1127.0.0.1:3306localhost

我的问题是为什么它只允许我使用本地主机IP地址连接到DB,而不是名称或外部IP。如果我想能够在网站上使用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      |

答案 1

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

来自 MySQL 文档

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

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

  1. 你可以只使用TCP / IP而不是Unix套接字。您可以通过 使用 而不是 在连接时执行此操作。不过,Unix套接字的使用起来可能更快、更安全。127.0.0.1localhost
  2. 您可以在php.ini中更改套接字:打开MySQL配置文件以查找MySQL创建套接字的位置,并将PHP设置为该路径。在我的系统上,它是.my.cnfmysqli.default_socket/var/run/mysqld/mysqld.sock
  3. 打开连接时,直接在 PHP 脚本中配置套接字。例如:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    

答案 2

如果这是一个PHP问题,你可以简单地改变配置文件php.ini它所在的位置,并更新PORT / SOCKET-PATH等的设置,使其连接到服务器。

在我的情况下,我打开了文件php.ini并做了

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

它立即起作用了。我不得不承认,我从接受的答案中得到了暗示,@Joni


推荐