我目前使用EasyPHP作为我的WAMP开发服务器,所以我可以创建Web应用程序.问题是,当我得到MysqLi对象连接到数据库需要1秒.在共享托管结果上运行相同的查询速度超过200倍.这应该是我应该担心的事吗?在可扩展性或将应用程序移动到另一个服务器方面,花一点时间看看问题是否明智?我只是假设EasyPHP很慢.不是专业,只是让我感兴趣的东西.
为什么会发生这种情况?
这个问题的原因是IPv4与IPv6.
当您使用主机名而不是IP地址时,MysqL客户端首先为该名称运行AAAA(IPv6)主机查找,如果成功将名称解析为IPv6地址,则首先尝试此地址.如果任一步骤失败(名称解析或连接),它将回退到IPv4,运行A查找并尝试此主机.
这在实践中意味着如果IPv6本地主机查找成功,但是MysqL并未绑定到IPv6环回,则在发生IPv4回退之前,您将需要等待一个连接超时周期(显然在OP的计算机上为1秒)并且连接成功.
这不是Windows 7之前的一个问题,因为本地主机解析是通过hosts文件完成的,而且它预先配置了127.0.0.1 – 它没有附带它的IPv6对应的:: 1.
然而,由于Windows 7,因为本地主机解析器内置在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或for 1用于环回).这将服务器绑定到该地址,并且仅将该地址绑定.
魔术字符串::.这将在IPv4和IPv6模式下将MysqL绑定到机器上的每个地址,包括环回和物理接口地址.这可能是一个安全风险,只有当您需要MysqL接受来自远程主机的连接时,才能实现此目的.
>使用IPv4-mapped IPv6 address.这是一种内置于IPv6中的特殊机制,可在4 – > 6转换,它允许绑定到一个特定的IPv4地址,它的IPv6等效.对于“双回环”地址:: ffff:127.0.0.1以外的其他任何东西,这对你来说都是不太有用的.这对大多数人来说最有可能是最好的解决方案,只能绑定到环回,但允许IPv4和IPv6连接.
没有.不要修改hosts文件. DNS解析器知道如何处理本地主机,重新定义它最多没有任何效果,最坏的时候会混淆解决方案.
没有此配置选项,MysqL将尝试通过PTR DNS查询将所有客户端连接IP地址解析为主机名.如果您的MysqL服务器已启用IPv6,但连接仍然需要很长时间,可能是由于反向DNS(PTR)记录配置不正确.
禁用名称解析将解决此问题,但它确实有其他后果,特别是配置为在主机条件下使用DNS名称的任何访问权限现在都将失败.
如果要执行此操作,您将需要配置所有授权以使用IP地址而不是名称.