admin管理员组文章数量:1632335
问题描述
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 地址,因此一旦遇到此类操作时就会出现很长的等待时间。
流传的解决方法
目前网上给出的方法主要有:
- 修改 Windows 的 hosts 文件,加上一行
127.0.0.1 localhost
,随后需要 flushdns 一下。
—— 这样似乎能够显式指定将 localhost 解析为 IPv4,但在自己的机器和服务器上都没有任何效果,怀疑 CGI 方式调用 PHP 的时候是无视主机文件的。 - 修改所有涉及 localhost 的 PHP 代码,把 localhost 替换成
127.0.0.1
的形式。
—— 这样做确实解决了一部分问题,但毕竟不是稳妥之计;而且对于 phpMyAdmin 等工具而言就只能冒险修改已经调试完善的代码。 - 禁用相关服务,Win + R 运行命令
services.msc
进入服务项管理,停止一个名称叫 IP Helper,服务名为iphlpsvc
的服务。
—— 与方法 1 类似,看起来有道理但实际上也没起到任何效果。 - 回避问题,使用 5.2 以降的 PHP,甚至使用虚拟网卡、虚拟机这些办法。
—— 拜托,认真的吗??
比较好的解决办法
最后通过修改注册表禁用 IPv6 组件,较好地解决了问题。新建一个注册表项(扩展名 .reg
的纯文本)文件,内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters]
"DisabledComponents"=dword:000000ff
保存,双击导入(或者按照文件的内容自行修改注册表),重启计算机即可。
版权声明:本文标题:彻底解决 Windows 下 PHP 响应异常缓慢的问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729118396a1187371.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论