今天在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'这样的提示。