萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysqli連接提示 Warning: mysqli::mysqli(): (HY000/2002): No such file or directory

mysqli連接提示 Warning: mysqli::mysqli(): (HY000/2002): No such file or directory

mysqli連接提示 Warning: mysqli::mysqli(): (HY000/2002): No such file or directory問題在這個是使用了localhost才會出現了,那麼這個是什麼問題呢。

今天在使用PHP的CLI方式訪問mysql數據庫時出現了一個 No such file or directory的錯誤,查找資料並在最終解決後記錄一下。

這個問題應該也會存在於非CLI方式訪問,簡單的代碼是這樣的:


<?php

$mysqli = new mysqli('localhost', 'root', 'root', 'test');

如果上面的連接地址是 localhost 就會報此錯誤,改成 127.0.0.1 後正常。
當主機填寫為localhost時MySQL會采用 unix domain socket連接,當主機填寫為127.0.0.1時MySQL會采用TCP/IP的方式連接。使用Unix socket的連接比TCP/IP的連接更加快速與安全。這是MySQL連接的特性,可以參考官方文檔的說明4.2.2. Connecting to the MySQL Server。

這個問題有以下幾種解決方法:

使用TCP/IP代替Unix socket。即在連接的時候將localhost換成127.0.0.1。
修改MySQL的配置文件my.cnf,指定mysql.socket的位置:
/var/lib/mysql/mysql.sock (你的mysql.socket路徑)。

直接在php建立連接的時候指定my.socket的位置(官方文檔:mysqli_connect)。比如:

$db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock')

通常意義上localhost和127.0.0.1是等價的,只是mysql在處理這個名詞的問題上有一些不同,是根據不同的地址來采取的不同的通信手段。
問題的最終解決方案是在連接的時候手動指定了 sock 文件的路徑
原因呢,我猜大概是為了本地應用能獲得更好的性能。而且localhost這個地址在mysql中也不會做匹配。即user@’%’不能匹配到user@’localhost’

copyright © 萬盛學電腦網 all rights reserved