今天刚发现一个问题,PHP连接MySQL的时候,不同环境的localhost会有不同的结果。
我的服务器装了2套PHP,其中有一个是用源码编译的,另一个是xampp集成包。
编译的php用于生产环境,xampp用来建立测试环境。
把线上的代码放到测试环境下,居然报告无法连接MySQL!
刚开始以为是端口的问题,可是我在命令行下怎么连接都没问题。最后抱着试试看的想法,把localhost改成了127.0.0.1,这回居然成功了。
我不能理解,线上代码运行的好好的,配置文件就是localhost呀,怎么到测试环境就必须改成127.0.0.1才行?
两套环境,主要的区别就是PHP,虽然版本都一样,不过xampp是编译好的,我估计问题出在这里。
然后立刻写了一个测试程序:
$connA = mysql_connect(‘127.0.0.1:3306’, ‘leakon’, ‘pass’);
$connB = mysql_connect(‘localhost:3306’, ‘leakon’, ‘pass’);
var_dump($connA);
var_dump($connB);
在命令行下分别用编译和xampp的php执行上述代码,果然发现两项结果不一样。
后来分析了一下,按照这种方式理解:编译PHP的时候需要指定MySQL的安装路径,这个时候localhost就指向对应的MySQL。与编译版的PHP不一样,xampp指向的是随包附带的二进制版MySQL,因此他发现这个MySQL的root密码不对,拒绝连接。
但用127.0.0.1作为主机地址时,PHP就不会按照编译的localhost找MySQL服务器,而是根据端口来找,这回就没问题了。
同时也发现了一个问题,当用localhost:port作为主机地址时,PHP会忽略端口号!
不信你试试上面的代码,那个port写成什么都无所谓,只要是localhost,就会链接特定的MySQL。
不知道为什么,就当经验,记住这个事实吧!
http://serverfault.com/questions/295285/mysql-cannot-connect-via-localhost-only-127-0-0-1