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