破解Windows+PHP+MySQL性能之谜

本博客使用的是基于PHP的WordPress平台,服务器是Windows Server 2016+IIS 10.0,数据库是在本机上部署的MySQL数据库。这是一个很多网友不待见的组合,而我之前也遇到了严重的性能问题,访问主页时,服务器平均响应时间(从浏览器完成请求到开始接收应答的时间)竟然高达1.58秒。

在网上查询有关“PHP 性能”等关键字,绝大多数网友给出的答案是:我换了Linux服务器之后问题就解决了。然而我认为这并不是Windows的缺陷导致的。(实际上确实不是。)

我的博客上安装了WP-Super-Cache插件,开启PHP缓存模式,也就是说,所有的请求依然通过PHP处理,但是PHP会在条件许可的情况下直接返回之前的缓存。在缓存命中的情况下,多次测试,服务器平均只需要44ms就能返回结果。这说明所谓的“Windows+IIS下PHP需要启动时间导致性能低下”的说法是不存在的。

最后,访问国外论坛终于发现了问题的原因。Windows中,localhost默认是作为IPv6地址::1来解析的,但是MySQL默认情况下是不接受IPv6连接的,于是在PHP试图访问localhost上的数据库时,IPv6连接会失败,然后才回退到IPv4连接。解决方法有两个,一个是将数据库地址从localhost改为127.0.0.1,另一个是在MySQL的配置文件my.ini中,在[mysqld]后插入配置”bind-address = ::”。

注:MySQL配置项bind-address默认值为0.0.0.0,意为接受来自任何IPv4地址的链接。::意味着接收来自任何IPv4或IPv6地址的连接。::1意味着只接受来自本机的IPv6连接。参见IPv6 Support – MySQL 5.5 References(英文)

在允许MySQL接受IPv6连接之后,再次测试,服务器的平均响应时间下降到了475ms。相比原来下降了70%。

三种情况性能对比:

缓存命中:44ms

无缓存,MySQL允许IPv6连接:475ms

无缓存,MySQL不允许IPv6连接:1580ms

留言

有想法?请给我们留言!您的留言不会直接显示在网站内。