PHP致命错误:未捕获exception’PDOException’,消息’SQLSTATE 连接被拒绝
我的数据库有不同的服务器。
当我用PDO连接到数据库时,我使用数据库VM的IP地址作为主机参数:
$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')
但我拒绝连接(PDOException’,消息’SQLSTATE [HY000] [2002]’)。 我想它在那里找不到MySQL。 但是,它可以找到具有该IP的VM。
那么检查mysql是否真的没有运行:
sudo aptitude install nmap
然后:
sudo nmap -sS
您也可以在mysql服务器上安装该工具,该命令将是:
sudo nmap -sS localhost
在这两种情况下,你的答案应该是这样的。
[simmel]@[mars]$ sudo nmap -sS 172.16.1.41 Starting Nmap 6.40 ( http://nmap.org ) at 2015-04-08 15:09 CEST Nmap scan report for 172.16.1.41 Host is up (0.010s latency). Not shown: 996 closed ports PORT STATE SERVICE 3306/tcp open mysql Nmap done: 1 IP address (1 host up) scanned in 33.17 seconds
如果它显示端口3306,它确实打开并准备连接。 如果是这种情况,请通过计算机上的命令行使用mysql。
mysql -u -p -h
出现相同的消息? 拒绝连接? 那么您的用户可能拥有错误的权利。
另一个原因是当mysql服务器绑定到某个地址时,如127.0.0.1。
要找出检查输出:
sudo netstat -tlpen
如果mysql没有收听0.0.0.0:3306
而是收听127.0.0.1:3306
,那么你只能从localhost连接。
要更改它转到/etc/mysql/my.cnf
并注释掉以下行:
bind-address = 127.0.0.1
评论它的方法是添加一个领先的#
字符:
#bind-address = 127.0.0.1
保存文件并重新启动mysql服务
sudo service mysql restart
现在你应该可以连接了。
要更改端口,请输入,例如:
port = 8888
在/etc/mysql/my.cnf
。
保存文件并重启mysql服务:
sudo service mysql restart
错误2002意味着MySQL无法通过套接字文件连接到本地数据库服务器(例如/tmp/mysql.sock
)。
要找出套接字文件的位置,请运行:
mysql_config --socket
然后仔细检查您的应用程序是否使用正确的Unix套接字文件或通过TCP / IP端口连接。
测试sockets:
mysql --socket=/var/mysql/mysql.sock
如果Unix套接字错误,您可以对其进行符号链接,例如:
ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
或更正您的配置文件(例如php.ini
)。
要直接从PHP测试PDO连接,您可以运行:
php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"
还要检查Apache和CLI(命令行界面)之间的配置,因为配置可能不同。
可能是服务器正在运行,但您尝试使用与服务器正在侦听的TCP / IP端口,命名管道或Unix套接字文件不同的TCP / IP端口进行连接。 要纠正您需要调用客户端程序(例如,指定
--port
选项)以指示正确的端口号,或正确的命名管道或Unix套接字文件(例如--socket
选项)。
请参阅: 连接到MySQL的问题疑难解答
其他有助于跟踪问题的工具/命令:
-
netstat -ln | grep mysql
-
php -r "phpinfo();" | grep mysql
-
php -i | grep mysql
- 在
xdebug.ini
使用XDebug和xdebug.show_exception_trace=1
- 在OS X上尝试使用
strace
进行Linux调试时sudo dtruss -fn mysqld
- 检查Unix套接字的权限:
stat $(mysql_config --socket)
以及是否有足够的可用空间(df -h
)。 - 重启你的MySQL。
- 检查
net.core.somaxconn
。