![](/img/trans.png)
[英]mysqli_connect(): (HY000/2002): Can't connect to local MySQL server through socket
[英]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.1
和127.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
| 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選項來顯式指定連接協議,即使是本地主機也是如此。
有幾種方法可以解決此問題。
127.0.0.1
而不是localhost
來完成此操作。 但是,Unix套接字使用起來可能更快,更安全。 php.ini
更改套接字:打開MySQL配置文件my.cnf
以查找MySQL在何處創建套接字,並將PHP的mysqli.default_socket
設置為該路徑。 在我的系統上是/var/run/mysqld/mysqld.sock
。 打開連接時,直接在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
。
因此,基本上如果您指定localhost
或null
值,它會強制執行命名管道/套接字連接(請參閱: mysqli.default_socket
),否則(例如,當您指定端口或非本地主機時)它將使用 TCP/IP 協議(例如localhost:3308
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.