彻底解决 Windows 下 PHP 响应异常缓慢的问题

问题描述

PHP 写的后端程序,一旦涉及数据库操作,响应就会变得异常得慢(这里的异常是指:同样的程序在 Linux 下执行,速度没有问题),常常需要等待数十秒,但每次的返回结果中,实际用于执行 SQL 查询的时间均短至毫秒量级。

PHP 版本:7.2.25、7.2.13、7.1.33、5.3.3,无论老版本还是目前 7.2 最新的子版本都有一样的问题,看来官方似乎并不想处理。

问题排查

进行查询操作请求时,我用的代码是如下的形式:

$db_host = "localhost";
$db_connect = mysqli_connect($db_host,$db_username,$db_password,$db_targetdb);
// mysqli_query ...

通过搜索了解到 PHP 在 Windows 下运行时,遇到 localhost 会尝试先将其解析成 IPv6 地址,当无法解析或者无法用 IPv6 连接数据库时会等待超时,再尝试解析成 IPv4 地址,因此一旦遇到此类操作时就会出现很长的等待时间。

流传的解决方法

目前网上给出的方法主要有:

  1. 修改 Windows 的 hosts 文件,加上一行 127.0.0.1 localhost,随后需要 flushdns 一下。
    —— 这样似乎能够显式指定将 localhost 解析为 IPv4,但在自己的机器和服务器上都没有任何效果,怀疑 CGI 方式调用 PHP 的时候是无视主机文件的。
  2. 修改所有涉及 localhost 的 PHP 代码,把 localhost 替换成 127.0.0.1 的形式。
    —— 这样做确实解决了一部分问题,但毕竟不是稳妥之计;而且对于 phpMyAdmin 等工具而言就只能冒险修改已经调试完善的代码。
  3. 禁用相关服务Win + R 运行命令 services.msc 进入服务项管理,停止一个名称叫 IP Helper,服务名为 iphlpsvc 的服务。
    —— 与方法 1 类似,看起来有道理但实际上也没起到任何效果。
  4. 回避问题,使用 5.2 以降的 PHP,甚至使用虚拟网卡、虚拟机这些办法。
    —— 拜托,认真的吗??

比较好的解决办法

最后通过修改注册表禁用 IPv6 组件,较好地解决了问题。新建一个注册表项(扩展名 .reg 的纯文本)文件,内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters]
"DisabledComponents"=dword:000000ff

保存,双击导入(或者按照文件的内容自行修改注册表),重启计算机即可。

你可能感兴趣的:(php,WAMP,php,Windows,IPv6,WAMP)