边肖:最近在本地调试网站时,phpcms等一些程序出现了这个问题,速度非常慢。偶然发现下面这篇文章,提醒我原来问题是这样的。
最近,当我在windows上开发一个应用程序时,我发现了一个有趣的问题:我的本地程序连接到本地mysql库打开它需要大约一秒钟的时间。
问题分析
考虑到可能是程序性能问题,我用xdebug的性能日志功能输出了程序运行日志,发现连接mysql的函数时间居然占用了近95%的执行时间。
确认是mysql性能问题后,我认为是mysql的域名反向查找功能影响了速度。令我失望的是,在my.ini中关闭域名反向查找后,问题依然存在
在我百思不得其解的时候,突然想到把代码中服务器的地址从localhost改成127.0.0.1,那神奇的一秒延迟竟然消失了。
转ip其实挺好的。localhost有问题吗?打开cmd,键入ping localhost,ping输出的结果让我大吃一惊:
是的,来自localhost的ipv6地址是:1,所以这第二次延迟的原因很容易理解。使用localhost连接,程序解析的地址是ipv6地址:1。
然后尝试连接到mysql监听这个地址。很明显,mysql监听的是127.0.0.1的ipv4地址,IPv6超时后会连接到127.0.0.1的ipv4地址,这就是这一秒延迟的原因。
打开windows hosts文件,您将看到以下注释。
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# :1 localhost
解决办法
备选方案1。用127.0.0.1代替localhost连接mysql。
选项2。编辑hosts文件,强制将127.0.0.1绑定到本地主机。