今天在使用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’