性能差是 WordPress 广为诟病的一个特点,有个木桶理论说一只水桶能装多少水取决于它最短的那块木板,想让木桶多装点水,找到最短的那块木板是让木桶多装点水的第一步。拿到 WordPress 上来说,找到影响 WordPress 整体性能的程序处理环节是提高 WordPress 性能的第一步。问题是,程序都是在服务器上运行的,WordPress 有那么多函数和类,怎么才能知道是哪个程序影响到了 WordPress 性能了呢?这就是今天要为大家介绍的 XHProf,XHProf 是 Facebook 开发的一个测试 php 性能的扩展,用来跟踪程序的运行情况。
安装 XHProf 扩展
首先下载 XHProf (http://pecl.php.net/package/xhprof) 并解压,然后切换到解压出来的扩展目录,参照下面命令进行安装。
cd xhprof/extension
/usr/local/php5.6/bin/phpize
./configure --with-php-config=/usr/local/php5.6/bin/php-config --enable-xhprof
make
make install
在 WordPress 中启用XHProf
编辑 php.ini, 添加以下配置,其中 xhprof.output_dir 指定了生成的profile文件存储的位置,我们将其指定为 /tmp。
[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp
使用 XHProf 完成性能分析并且获到结果之后,结果是以数组形式储存的,如果不借助一些工具,我们很难分析这些数据,xhprof 提供了基于 Web 的界面以方便我们对分析结果进行查看。将 XHProf 安装包中的 xhprofhtml 和 xhproflib 目录放到服务器的 Web 目录下,让 xhprof_html 目录中的内容对外可以访问。然后访问 xhprof_html/index.php
就可以以可视化的方式查看分析的结果了,结果中主要有一下几项数据。
- funciton name : 函数名
- calls: 调用次数
- Incl. Wall Time (microsec): 函数运行时间(包括子函数)
- IWall%:函数运行时间(包括子函数)占比
- Excl. Wall Time(microsec):函数运行时间(不包括子函数)
- EWall%:函数运行时间(不包括子函数)
如果服务器安装了 graphviz,我们还可以得到一个类似下面的图形分析结果。
分析 XHProf 数据,找出性能瓶颈
针对 WordPress 的结果进行分析,我们很容易可以得到以下一些结论。
- 严重影响 WordPress 性能的往往是几个函数。
- 数据库读取是影响 WordPress 性能最大的因素,这也是大部分 WordPress 缓存插件都会缓存数据,减少数据库读取的原因。
- WordPress 的 Metadata 对性能的影响比较大。
- apply_filter 对性能的影响也比较大。
由此,我们可以稍微得到一些启发,开发 WordPress 自定义功能的时候,尽量减少 Metadata 的使用,如果必须使用,可以考虑把多条数据组合成数组或对象放在一条 Metadata 记录里面。同时,对于流量较大的网站,使用缓存插件对于提高 WordPress 的性能是有帮助的。