PDO可以连接到localhost中的MySQL,但不是远程的,即使它们是同一台服务器

时间:2011-02-08 13:05:10

标签: php mysql connection pdo

假设MySQL服务器是mydomain.com:3306,Apache和MySQL在同一台服务器上。

当我将PHP脚本上传到服务器时,我总是可以将MySQL连接到PDO和这个DNS:

mysql:host=localhost;dbname=my_database

但是,如果我将DNS字符串更改为:

mysql:host=mydomain.com;dbname=my_database 

刚刚将localhost更改为mydomain.com,其他所有设置(如用​​户名和密码)都保持不变。我收到了这个警告:

OK packet 6 bytes shorter than expected

我发现了很多关于OK packet 6 bytes shorter than expected问题的讨论,它们都与密码散列有关。但是,由于我可以使用localhost设置连接到服务器,因此在我的情况下我不认为密码散列是原因。

有人遇到过这个问题吗?

P.S。我正在使用Kohana 3.0.9的数据库模块进行连接 p.p.s. MySQL版本:5.1.52,PHP版本:5.3.2

4 个答案:

答案 0 :(得分:2)

这可能是因为127.0.0.1:3306是一个不同的IP&来自yourExternalIP:3306的端口并使用您的域名将连接您的外部IP ,它与localhost(127.0.0.1)

的IP不同

除非您已将mysql配置为侦听所有 IP,并且允许所有用户访问所有IP,否则您无法假设mysql正在侦听您的外部IP,或者允许用户名/密码从“远程主机”访问(即从&通过外部IP)

答案 1 :(得分:0)

mysql客户端可以使用主机名连接吗?

  • mysql可能不会侦听DNS解析的接口。
  • 甚至可以配置mysql关闭网络连接,但您可以通过套接字本地连接。

答案 2 :(得分:0)

MySQL的驱动程序有一个“优化”,使用“localhost”作为服务器主机名将在内部重新映射到使用unix-domain套接字而不是TCP套接字。这是出于速度原因,因为unix套接字比TCP快得多(特别是因为你没有通过TCP堆栈完全运行的开销),但它确实会导致行为不一致,尤其是在使用时不匹配的驱动程序版本。

答案 3 :(得分:0)

如果您的托管公司为其服务器使用SAT,这意味着您的服务器具有内部IP(例如:10.0.0.101),并且地址转换您使用mydomain.com解析的外部IP(例如:241.34.31.2) ,然后他们的防火墙可能没有设置为实际再次将这种流量路由回来。

无论哪种方式,在这种情况下强行通过防火墙并不是一个好主意,你最好直接使用你的IP(或localhost)。

但我猜这里的其他建议更合理,特别是如果错误与密码检查有关。