以前nginx、php和mysql都搭建完成了,測試phpinfo()頁面也能夠顯示,但在測試php與mysql之間的鏈接仍是有問題,報錯以下:php
Warning: mysqli::__construct(): (HY000/2002): No such file or directory in /application/nginx-1.14.2/html/mysql.php on line 2
OK!能夠鏈接
Warning: mysqli::close(): Couldn't fetch mysqli in /application/nginx-1.14.2/html/mysql.php on line 8html
No such file意思是找不到mysql.sock文件,也就是說mysql和php之間沒法經過socket方式通訊。mysql
查閱網上資料,我總結出如下四種解決方法:nginx
一、修改php中的localhost爲127.0.0.1,改用TCP/IP方式和MySQL通訊sql
二、卸載MySQL、從新編譯安裝MySQL,編譯時要多指定一條參數:segmentfault
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.24/data/mysql.sockphp7
該路徑與php.ini和/etc/my.cnf中指定的mysql的socket路徑一致,個人是/application/mysql-5.7.24/data/mysql.sock。app
三、作個連接文件:socket
ln (-s) /application/mysql/data/mysql.sock /tmp/mysql.sockide
通過測試,軟硬連接均可以。
源文件/application/mysql/data/mysql.sock是mysqli的默認socket路徑,連接文件/tmp/mysql.sock是pdo_mysql的默認socket路徑,經過作連接讓這兩個文件內容保持一致。
以上路徑能夠在phpinfo()頁面找到。
四、修改php文件第2行,指定這次php頁面通訊的socket爲/application/mysql/data/mysql.sock:
$mysqli = new mysqli("localhost","root","oldboy123","mysql","3306","/application/mysql/data/mysql.sock");
刷新頁面,頁面若是報錯Permission denied
(Warning: mysqli::__construct(): (HY000/2002): Permission denied in /application/nginx-1.14.2/html/mysql3.php on line 2
OK!能夠鏈接
Warning: mysqli::close(): Couldn't fetch mysqli in /application/nginx-1.14.2/html/mysql3.php on line 8)
請檢查php用戶有沒有讀取/application/mysql/data/mysql.sock的權限。
[root@THZZC-1 ~]# ll /application/mysql/data/mysql.sock
srwxrwxrwx 2 mysql mysql 0 Apr 7 20:11 /application/mysql/data/mysql.sock
[root@THZZC-1 ~]# ll /application/mysql/data/ -d
drwxr-x--- 5 mysql mysql 4096 Apr 7 20:11 /application/mysql/data/#<==mysql.sock有讀權限,但上一級目錄data沒有讀取data目錄下文件(mysql.sock)的權限
[root@THZZC-1 ~]# chmod o=rx /application/mysql/data/
[root@THZZC-1 ~]# ll /application/mysql/data/ -d
drwxr-xr-x 5 mysql mysql 4096 Apr 7 20:11 /application/mysql/data/#<==讀目錄下文件權限須要r、x
總結:這次報錯是因爲mysql默認的socket配置有問題,致使socket方式沒法通訊,方法1轉移了陣地,改用TCP/IP方式與MySQL通訊。方法2和3的本質相同,都是爲了指定一致的默認socket路徑。方法4是曲線救國,作連接讓兩個socket文件內容如出一轍,從而實現socket通訊。
##### php7測試文件mysql.php的代碼以下:
cat /application/nginx/html/mysql.php
<?php
$mysqli = new mysqli("localhost","root","oldboy123");
if(!$mysqli) {
echo"FAILD!鏈接錯誤,用戶名密碼不對";
}else{
echo"OK!能夠鏈接";
}
$mysqli->close();
?>
相關連接:https://segmentfault.com/q/1010000000328531