PHP到EasyPHP MySQL服务器1秒连接延迟

时间:2012-07-03 12:07:37

标签: php mysqli easyphp

我在这里问这个因为我认为它不仅适用于EasyPHP本身。

我目前使用EasyPHP作为我的WAMP开发服务器,因此我可以创建Web应用程序。问题是,当我将mysqli对象连接到数据库时需要1秒钟。在共享主机上运行相同的查询会导致速度超过200倍。这应该是我应该担心的吗?在可伸缩性或将我的应用程序移动到另一台服务器方面,花一点时间看看问题是否明智?我只是假设也许EasyPHP很慢。不是一个专业,只是令我感到有趣的东西。

3 个答案:

答案 0 :(得分:50)

如果您遇到此问题并在Windows 7之前使用Windows版本,这可能不是您的问题的答案。

为什么会这样?

此问题的原因是IPv4与IPv6。

当您使用主机名而不是IP地址时,MySQL客户端首先对名称运行AAAA(IPv6)主机查找,如果成功将名称解析为IPv6地址,则首先尝试此地址。如果任一步骤失败(名称解析或连接),它将回退到IPv4,运行A查找并尝试使用此主机。

这在实践中意味着如果IPv6 localhost查找成功但MySQL没有绑定到IPv6环回,则需要等待一个连接超时周期(显然在OP' s上)机器这是1秒)在IPv4回退发生并且连接成功之前。

这不是Windows 7之前的问题,因为localhost解决方案是通过hosts文件完成的,并且它预先配置了127.0.0.1 - 它没有附带它的IPv6对应::1

但是,从Windows 7开始,localhost解析已内置到DNS解析器中,原因如here所示。这意味着IPv6查找现在将成功 - 但MySQL未绑定到该IPv6地址,因此连接将失败,您将看到此问题中概述的延迟。

那很好。告诉我如何解决它!

您有几个选择。环顾互联网,一般"解决方案"似乎是明确地使用IP地址而不是名称,但有几个理由不这样做,两者都是可移植性相关的,两者都可能不重要:

  • 如果您将脚本移动到支持IPv6的另一台计算机,则您的脚本将不再有效。

  • 如果将脚本移动到基于* nix的托管环境,魔术字符串localhost将意味着MySQL客户端更愿意使用Unix套接字(如果配置了一个),这比基于IP环回的连接

它们听起来很重要吗?

他们不是。您应该设计应用程序,以便在配置文件中定义此类事物。如果将脚本移动到其他环境,则可能还需要配置其他内容。

总之,使用IP地址不是最佳解决方案,但它很可能是可接受的解决方案。

那么什么是最佳解决方案?

最好的方法是更改​​MySQL服务器使用的绑定地址。但是,这并不像人们想的那么简单。与Apache,Nginx和几乎所有其他理智的网络服务应用程序不同,MySQL只支持单个绑定地址,因此它不仅仅是添加另一个绑定地址的情况。幸运的是,操作系统在这里确实支持了一些魔力,因此我们可以让MySQL同时使用IPv4和IPv6。

您需要运行MySQL 5.5.3或更高版本,并且需要使用--bind-address=命令行参数启动MySQL(或在my.ini中设置相应的选项)。您有4个选项 docs ,具体取决于您要执行的操作:

  • 您可能熟悉的那个,以及您最有可能(有效)使用的那个,0.0.0.0。这将绑定到计算机上的所有可用IPv4地址。即使您不关心IPv6,这实际上也可能不是最好的事情,因为它会遇到与::相同的安全风险。

  • 显式的IPv4或IPv6地址(例如127.0.0.1::1用于环回)。这会将服务器绑定到该地址,仅绑定该地址。

  • 魔术字符串::。这将把MySQL绑定到机器上的每个地址,包括IPv4和IPv6模式中的环回和物理接口地址。这可能存在安全风险,只有在需要MySQL接受来自远程主机的连接时才会这样做。

  • 使用IPv4-mapped IPv6 address。这是一种内置于IPv6中的特殊机制,用于在4 - > 1期间向后兼容。 6转换,它允许您绑定到特定的IPv4地址和它的IPv6等价物。除了"双环回"之外,这对你来说不太可能有用。地址1}}。对于大多数人来说,这很可能是最好的解决方案,只能绑定到环回但允许IPv4和IPv6连接。

我是否需要修改主机文件?

即可。不要修改hosts文件。 DNS解析器知道如何处理::ffff:127.0.0.1,重新定义它最多只会产生影响,最糟糕的是混淆了解析器的地狱。

--skip-name-resolve怎么样?

这也可以解决问题/需要解决问题,原因只是相关但略有不同。

如果没有此配置选项,MySQL将尝试通过localhost DNS查询将所有客户端连接IP地址解析为主机名。如果您的MySQL服务器已经启用使用IPv6但连接仍然需要很长时间,可能是因为反向DNS(PTR)记录未正确配置。

禁用名称解析将解决此问题,但它确实有其他后果,特别是配置为使用PTR条件中的DNS名称的任何访问权限现在都将失败。

如果要执行此操作,则需要将所有授权配置为使用IP地址而不是名称。

答案 1 :(得分:26)

当我使用localhost作为MySQL服务器地址时,我有一些延迟。将其更改为127.0.0.1有帮助。

答案 2 :(得分:0)

无论服务器如何,尽可能使用持久连接会很好。毕竟,当旧的连接也可以执行工作时,始终打开新连接是不明智的。看看manual的mysqli。