gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:06:33 25 4
gpt4 key购买 nike

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

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

最佳答案

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

为什么会这样?

此问题的原因是 IPv4 与 IPv6。

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

这在实践中意味着如果 IPv6 localhost查找成功但 MySQL 未绑定(bind)到 IPv6 环回,您需要等待一个连接超时周期(显然在 OP 的机器上为 1 秒),然后 IPv4 回退发生并且连接成功。

这在 Windows 7 之前不是问题,因为 localhost解析是通过主机文件完成的,并且它只预配置了 127.0.0.1 - 它没有与 IPv6 对应的版本一起提供 ::1 .

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

那很好。只要告诉我如何修复它!

你有几个选择。环顾互联网,一般的“解决方案”似乎是明确使用 IP 地址而不是名称,但有几个原因不这样做,两者都与可移植性有关,两者都可以说并不重要:

  • 如果您将脚本移到另一台仅支持 IPv6 的机器上,您的脚本将不再起作用。
  • 如果您将脚本移至基于 *nix 的托管环境,则魔术字符串 localhost这意味着如果配置了一个 Unix 套接字,MySQL 客户端会更喜欢使用,这比基于 IP 环回的连接更有效

  • 不过,它们听起来很重要?

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

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

    那么最好的解决方案是什么?

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

    您需要运行 MySQL 5.5.3 或更高版本,并且您需要使用 --bind-address= 启动 MySQL。命令行参数(或在 my.ini 中设置相应选项)。您有 4 个选项 docs ,取决于你想做什么:
  • 您可能熟悉的,也是您最有可能(有效)使用的,0.0.0.0 .这将绑定(bind)到机器上所有可用的 IPv4 地址。即使您不关心 IPv6,这实际上也可能不是最好的做法,因为它面临与 :: 相同的安全风险。 .
  • 显式 IPv4 或 IPv6 地址(例如 127.0.0.1::1 用于环回)。这会将服务器绑定(bind)到该地址,并且仅绑定(bind)到该地址。
  • 魔弦:: .这将在 IPv4 和 IPv6 模式下将 MySQL 绑定(bind)到机器上的每个地址,包括环回和物理接口(interface)地址。这可能存在安全风险,仅当您需要 MySQL 接受来自远程主机的连接时才这样做。
  • 使用 IPv4-mapped IPv6 address .这是 IPv6 中内置的一种特殊机制,用于在 4 -> 6 转换期间向后兼容,它允许您绑定(bind)到特定的 IPv4 地址,它与 IPv6 等效。除了“双环回”地址 ::ffff:127.0.0.1 之外,这对您不太可能有用。 .对于大多数人来说,这很可能是最好的解决方案,仅绑定(bind)到环回但允许 IPv4 和 IPv6 连接。

  • 我需要修改hosts文件吗?

    .不要修改主机文件。 DNS 解析器知道如何处理 localhost ,重新定义它充其量没有任何效果,最坏的情况是混淆解析器。

    怎么样 --skip-name-resolve ?

    由于相关但略有不同的原因,这也可能解决问题/需要解决问题。

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

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

    如果您打算这样做,您需要将所有授权配置为使用 IP 地址而不是名称。

    关于PHP 到 EasyPHP MySQL 服务器 1 秒连接延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310564/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com