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

Sam*_*Sam 13 php mysqli easyphp

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

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

Dav*_*dom 53

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

为什么会这样?

导致此问题的原因是IPv4与IPv6.

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

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

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

由于Windows 7,但是,localhost分辨率内置在DNS解析,并对报告的原因在这里.这意味着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个选项文档,具体取决于您要执行的操作:

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

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

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

  • 使用IPv4映射的IPv6地址.这是一种内置于IPv6中的特殊机制,用于在4→6转换期间向后兼容,它允许您绑定到特定的IPv4地址,并且它与IPv6等效.除了"双环回"地址之外,这对你来说不太可能有用::ffff:127.0.0.1.对于大多数人来说,这很可能是最好的解决方案,只能绑定到环回但允许IPv4和IPv6连接.

我需要修改hosts文件吗?

.不要修改hosts文件.DNS解析器知道如何处理localhost,重新定义它最多只会产生影响,最坏的情况是将解决方案混淆掉.

怎么样--skip-name-resolve

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

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

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

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


bin*_*yLV 26

当我使用localhostMySQL服务器地址时,我有一些延迟.改变它有127.0.0.1帮助.