《Web集羣實戰》第6章PHP與MySQL鏈接測試遇到No such file or dir解決方法

以前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

nosuchfile.png

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

ok.png

總結:這次報錯是因爲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

相關文章
相關標籤/搜索