PHP無法用Socket方式連接MySQ

問題描述

今天在一臺新的服務器中安裝了php7.2,mysql-5.6后。測試用php連接mysql時發(fā)現(xiàn)無論如何php都連接不上mysql數(shù)據(jù)庫里逆,排除了數(shù)據(jù)庫賬號錯誤进胯,并且php已經安裝了連接數(shù)據(jù)庫的mysqlnd擴展。

問題排查

使用php連接測試腳本原押,查看到底是什么錯誤導致php連接不上mysql的胁镐。

以下是php連接mysql的php測試腳本mysql_connect_test.php

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = 'localhost';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// 檢查連接
if (!$connect)
{
    die("連接錯誤: " . mysqli_connect_error());
}
    die("連接成功...\n");
?>

注意觀察php腳本中,$dbhost的值我給的是localhost诸衔,也就是使用socket進行連接數(shù)據(jù)庫盯漂。

php_connect_mysql-1.png

經過測試,發(fā)現(xiàn)PHP報錯:No such file or directory in /root/mysql_connect_test.php on line 6

報錯說db-connect-test.php中的第6行有問題笨农,下面看下第8行的代碼:

$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

mysqli_connect()這是php連接數(shù)據(jù)庫的一個函數(shù)就缆,根據(jù)報錯提示這里面缺少文件或目錄。

mysqli_connect()函數(shù)的參數(shù)有:host磁餐,username违崇,password,dbname诊霹,port羞延,socket。

在mysqli_connect()函數(shù)中脾还,我已經加入了host伴箩,username,password鄙漏,dbname這4個參數(shù)了嗤谚。

經過調試,發(fā)現(xiàn)當我加入socket和port參數(shù)時怔蚌,php就可以正常連接數(shù)據(jù)庫了巩步。

下面是加入了socket參數(shù)后的php腳本:

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = 'localhost';
$dbport = '3306';
$dbsocket = '/tmp/mysql.sock';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbsocket);
// 檢查連接
if (!$connect)
{
    die("連接錯誤: " . mysqli_connect_error());
}
    die("連接成功...\n");
?>

到這里可以分析出,php連接數(shù)據(jù)庫的失敗的原因很可能是數(shù)據(jù)庫socket連接造成的桦踊。

為了證明這個結論椅野,讓PHP使用TCP/IP連接數(shù)據(jù)進行測試:

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = '127.0.0.1';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// 檢查連接
if (!$connect)
{
    die("連接錯誤: " . mysqli_connect_error());
}
    die("連接成功...\n");
?>

測試結果如下,可以看到使用TCP方式連接是可以成功的籍胯。

php_connect_mysql-2.png

解決問題

  • 查看mysql的socket文件

可以看到mysql使用的socket是/tmp/mysql.sock

mysql> show variables like "socket";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| socket        | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)
  • 查看php默認使用的mysql socket

發(fā)現(xiàn)php默認使用的mysql socket是 /var/mysql/mysql.sock

[root@centos ~]# php -r 'echo phpinfo();' | grep mysql.sock
mysqli.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock
pdo_mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock

經過對比竟闪,發(fā)現(xiàn)php和mysql指定的數(shù)據(jù)庫socket文件路徑不一樣,這可能也就是導致php在使用socket連接數(shù)據(jù)庫時出錯的原因杖狼。

這里先給出2個解決辦法:

  • 方法一:修改mysql的配置文件炼蛤,配置socket與php的一致
[root@centos ~]# mkdir -p /var/lib/mysql
[root@centos ~]# vim /etc/my.cnf
[mysqld]
socket = /var/lib/mysql/mysql.sock
  • 方法二:修改php的配置文件,配置socket與mysql的一致

更改php.ini中的 mysql.default_socket蝶涩、mysqli.default_socket理朋、pdo_mysql.default_socket絮识。但在PHP72版本中,php.ini配置文件中沒有mysql.default_socket嗽上,可以不進行設置此條配置笋除。

[root@centos ~]# vim /etc/php.ini
mysqli.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket = /tmp/mysql.sock

PHP72安裝完后,會在bin目錄下生成php-config炸裆、zts-php-config兩個腳本文件,這連個腳本用于獲取所安裝的php配置的信息鲜屏。這2個腳本中的socket路徑也只默認為/var/lib/mysql/mysql.sock

修改腳這兩個文件來制定mysql socket(可選烹看,非必須修改):

[root@centos ~]# sed -i 's@--with-mysql-sock=/var/lib/mysql/mysql.sock@--with-mysql-sock=/tmp/mysql.sock@g' /bin/php-config
[root@centos ~]# sed -i 's@--with-mysql-sock=/var/lib/mysql/mysql.sock@--with-mysql-sock=/tmp/mysql.sock@g' /bin/zts-php-config

修改完配置再重啟php-fpm后,php就可以使用socket的連接方式連接數(shù)據(jù)庫了洛史。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末惯殊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子也殖,更是在濱河造成了極大的恐慌土思,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆嗜,死亡現(xiàn)場離奇詭異己儒,居然都是意外死亡,警方通過查閱死者的電腦和手機捆毫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門闪湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绩卤,你說我怎么就攤上這事途样。” “怎么了濒憋?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵何暇,是天一觀的道長。 經常有香客問我凛驮,道長裆站,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任辐烂,我火速辦了婚禮遏插,結果婚禮上,老公的妹妹穿的比我還像新娘纠修。我一直安慰自己胳嘲,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布扣草。 她就那樣靜靜地躺著了牛,像睡著了一般颜屠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹰祸,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天甫窟,我揣著相機與錄音,去河邊找鬼蛙婴。 笑死粗井,一個胖子當著我的面吹牛,可吹牛的內容都是我干的街图。 我是一名探鬼主播浇衬,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼餐济!你這毒婦竟也來了耘擂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤絮姆,失蹤者是張志新(化名)和其女友劉穎醉冤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篙悯,經...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蚁阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辕近。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韵吨。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖移宅,靈堂內的尸體忽然破棺而出归粉,到底是詐尸還是另有隱情,我是刑警寧澤漏峰,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布糠悼,位于F島的核電站,受9級特大地震影響浅乔,放射性物質發(fā)生泄漏倔喂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一靖苇、第九天 我趴在偏房一處隱蔽的房頂上張望席噩。 院中可真熱鬧,春花似錦贤壁、人聲如沸悼枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒索。三九已至莹妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绰上,已是汗流浹背旨怠。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜈块,地道東北人鉴腻。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像百揭,于是被迫代替她去往敵國和親拘哨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361