簡體   English   中英

mysqli::mysqli(): (HY000/2002): 無法通過套接字'MySQL'連接到本地 MySQL 服務器 (2)

[英]mysqli::mysqli(): (HY000/2002): Can't connect to local MySQL server through socket 'MySQL' (2)

當我嘗試使用 php mysqli ZA2F2ED4F8EBC2CAB64C21A29Z4 連接到 mysql 數據庫時出現此錯誤。 使用以下代碼:

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

密碼為 * 以確保安全。

我創建了具有外部 ip 地址和 localhost 的所有權限的用戶kamil 當我運行: 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 或者如果我可以使用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 |

當您僅使用“ 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') 

如果是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接受的答案中得到了提示

如果'localhost'不起作用,但127.0.0.1起作用。 確保本地主機文件指向正確的位置。 (對於Linux / mac,為/ etc / hosts;對於Windows,為C:\\ Windows \\ System32 \\ drivers \\ etc \\ hosts)。

另外,請確保允許您的用戶連接到您要選擇的任何數據庫。

請檢查以下文件

%SystemRoot%\system32\drivers\etc\host

用ip綁定主機名的行可能缺少將它們綁定在一起的行

127.0.0.1  localhost

如果給定的行丟失。 在文件中添加行


您還可以檢查MySQL數據庫的用戶表,並告訴我們您正在使用的用戶的主機列值。 您應該對主機“ 127.0.0.1”和“ localhost”都具有用戶特權,並使用%,因為它是通用主機名的通配符。

我的問題是為什么它只允許我使用 localhost ip 地址而不是名稱或外部 ip 連接到數據庫。

根據mysqli_connect()的文檔:

參數: hostname :可以是主機名或 IP 地址。 null值或字符串“ localhost ”傳遞給此參數時,假定為本地主機。 如果可能,將使用管道而不是 TCP/IP 協議。 如果一起提供主機名和端口號,則使用 TCP/IP 協議,例如localhost:3308

因此,基本上如果您指定localhostnull值,它會強制執行命名管道/套接字連接(請參閱: mysqli.default_socket ),否則(例如,當您指定端口或非本地主機時)它將使用 TCP/IP 協議(例如localhost:3308 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM