今天在Mac上搭好了PHP環(huán)境,把之前在Windows和Linux下跑得挺好的程序搬過來,結(jié)果發(fā)現(xiàn)連不上數(shù)據(jù)庫了。數(shù)據(jù)庫連接的host我寫的是localhost,配置肯定沒問題,因?yàn)樵贘ava里用localhost能正常訪問,命令行也能連上。后來試著把localhost換成127.0.0.1或者本機(jī)IP,居然就好了。以前一直以為localhost和127.0.0.1是一回事,這回算是被現(xiàn)實(shí)打臉了。
網(wǎng)上搜了下這兩者的區(qū)別,果然有人早就講得很清楚,可以看這篇:http://www.*.net/article/50422.htm。簡(jiǎn)單說就是localhost是走socket連接,而127.0.0.1是通過TCP協(xié)議來連的。
這就解釋了為啥在Mac下會(huì)出問題。那為什么socket方式連不上?因?yàn)镸ac OS Lion系統(tǒng)自帶了Apache和PHP,我就直接用了默認(rèn)的配置。MySQL是從官網(wǎng)下載的DMG安裝的最新版本。在PHP的配置文件(/etc/php.ini)里有三個(gè)地方設(shè)置了mysql socket路徑,分別是:
mysql.default_socket
mysqli.default_socket
pdo_mysql.default_socket
它們的默認(rèn)值是 /var/mysql/mysql.sock
那怎么查看MySQL實(shí)際使用的socket文件在哪?有兩個(gè)方法:
方法一:
復(fù)制代碼:
echo show variables | mysql | grep socket
方法二:
復(fù)制代碼:
echo status | mysql | grep socket
注意:如果MySQL有密碼的話記得加 -u 和 -p 參數(shù)指定用戶名和密碼。
我這邊查出來發(fā)現(xiàn)MySQL的socket文件其實(shí)是放在 /tmp/mysql.sock 里的。
看到這里應(yīng)該明白問題出在哪了吧——用localhost的時(shí)候是通過socket方式連接,但PHP默認(rèn)配置的socket路徑不對(duì),自然就找不到socket文件,導(dǎo)致連接失敗。如果你有把錯(cuò)誤信息輸出來的話,應(yīng)該能看到類似Can't connect to local MySQL server through socket '/var/mysql/mysql.sock'這樣的提示。
網(wǎng)上搜了下這兩者的區(qū)別,果然有人早就講得很清楚,可以看這篇:http://www.*.net/article/50422.htm。簡(jiǎn)單說就是localhost是走socket連接,而127.0.0.1是通過TCP協(xié)議來連的。
這就解釋了為啥在Mac下會(huì)出問題。那為什么socket方式連不上?因?yàn)镸ac OS Lion系統(tǒng)自帶了Apache和PHP,我就直接用了默認(rèn)的配置。MySQL是從官網(wǎng)下載的DMG安裝的最新版本。在PHP的配置文件(/etc/php.ini)里有三個(gè)地方設(shè)置了mysql socket路徑,分別是:
mysql.default_socket
mysqli.default_socket
pdo_mysql.default_socket
它們的默認(rèn)值是 /var/mysql/mysql.sock
那怎么查看MySQL實(shí)際使用的socket文件在哪?有兩個(gè)方法:
方法一:
復(fù)制代碼:
echo show variables | mysql | grep socket
方法二:
復(fù)制代碼:
echo status | mysql | grep socket
注意:如果MySQL有密碼的話記得加 -u 和 -p 參數(shù)指定用戶名和密碼。
我這邊查出來發(fā)現(xiàn)MySQL的socket文件其實(shí)是放在 /tmp/mysql.sock 里的。
看到這里應(yīng)該明白問題出在哪了吧——用localhost的時(shí)候是通過socket方式連接,但PHP默認(rèn)配置的socket路徑不對(duì),自然就找不到socket文件,導(dǎo)致連接失敗。如果你有把錯(cuò)誤信息輸出來的話,應(yīng)該能看到類似Can't connect to local MySQL server through socket '/var/mysql/mysql.sock'這樣的提示。