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