真正掌握一种语言,在我理解上,关键并不在于你会不会用这种语言写代码,实现功能。而是能不能分析写出来的代码的运行状态,并找出其中的问题。这个时候,我们很需要工具来帮助我们来解析问题。一般来说,这种工具叫profiler。

1. XDebug

PHP的profiler工具我用过几个,最早的时候是xdebug,很知名的一个PHP扩展。其输出的结果,我们可以使用WinCacheGrind来解析,进行可视化分析。这种工作形式非常简洁便利,而且作为扩展安装,不需要对代码进行任何调整,可操作性很强。但是问题也很多:

  • xdebug无法按需求进行抽样、过滤性启动,即它无法真对某些特定的请求进行执行,也没办法抽样运行
  • 生成的结果只能输出成文件,合并上面一点,大家可以理解到,这个工具会对服务器IO造成多么大的压力,在真正的产品环境上
  • 观察工具非常呆板,而且只有windows版本,我之前为了在mac下进行解析,还费心从源码开始编译安装了一个开源工具,见《在MAC下如何图形profilePHP脚本》

总之,结论很简单,xdebug很难应用在真实的产品线上。

2. XHProf

作为世界最大且最知名的PHP语言使用者,facebook,当然也迫切地有profile PHP代码的需求。于是,facebook开源出了一个profile工具,这就是现在基本上成为PHP profile工具标配的XHProf。

和xdebug不同,虽然xhprof也是以扩展的形式安装在php上,但是其启动和产出结果是需要程序员主动调用函数来进行的,这就带来了灵活性。xhprof还有诸如消耗小等优点。

但事实上,世界上的事情没那么简单,xhprof也还是有问题。首当其中的一点就和xdebug相同,其输出的内容,作为一段字符串,必须由程序员编写代码进行持久化存储。其次,其周边支持程序和可视化的工具也不理想,基本上,除了核心的profile能力,xhprof没有做好周边的支持。于是大量的第三方开源工具就应运而生了。我们要做的是从中选择一款最适合的来使用。

3. Choose

我们简单分析下,作为一款profile,需要的功能点:

  • 轻量级,高效,使用简便(XHProf就很符合这点)
  • 能抽样进行分析,而不是全盘都分析
  • 能按条件启动分析
  • 能将分析结果进行持久化
  • 能有一个便利强大的GUI将分析结果展示出来
  • 能横向比较多个结果,解析其异同

这里我选的是xhgui,符合上面的所有需求。

4. XhGui

github主页:https://github.com/perftools/xhgui

简介:

A graphical interface for XHProf data built on MongoDB.

This tool requires that XHProf is installed, which is a PHP Extension that records and provides profiling data. XHGui (this tool) takes that information, saves it in MongoDB, and provides a convenient GUI for working with it.

4.1 安装

这工具安装的时候还遇到了不少问题,真心蛋痛,这里记录下。关键的问题在于composer这个PHP包管理工具,之前从来没用过。问题比较多。

在安装xhgui代码之前,首先先解决几个PHP扩展的依赖问题,按github上列的列表,安装下来,就应该没问题了。当然还有mongodb这个,记得要安装。

git clone https://github.com/perftools/xhgui.git

cd xhgui

php install.php

好,报错了:

#!/usr/bin/env php
Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The detect_unicode setting must be disabled.
Add the following to the end of your `php.ini`:
detect_unicode = Off

A php.ini file does not exist. You will have to create one.
If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.

怎么解决这里不多说了,简单来说,就是运行composer的PHP版本、PHP设置有问题,一般来说是PHP cgi和PHP cli版本不同造成的,至少我这里就是这个问题。

如果composer下载有问题的话,可以跳过install.php这个脚本,自己下载composer.phar,然后放到代码根目录就OK。

甚至实在不行,你可以根本不用install.php,使用你自己OK的那个PHP cli版本,运行这个命令:

php53 ./composer.phar update --prefer-dist

4.2 使用

PHP版本必须高于5.3,因为xhgui里用了不少lambda表达式。

官方推荐的使用方法是在php里设置auto_prepend_file这个选项,那么每个脚本在运行的时候,都会将xhgui的header.php代码插入进去。当然,如果你有自己的框架的话,你也可以选择自己进行整合,至少我就是这么做的。

在配置文件的 profiler.enable 这一项中,配置上启动判断条件的lambda函数,抽样分析和按条件分析就OK了。

配置文件的 save.handler 这一项决定了分析结果如何存储,写入mongodb,或者写成文件。注意,写成文件的分析结果,可以事后使用xhgui的import.php脚本导入到mongodb里。

此外就没什么别的需要注意的了,使用上来说还是很简单的。

4.3 GUI

简单截几个图,看下效果,基本上使用很简单,没什么需要特别说明的。

compare效果:

compare

profile效果1:

profile1

profile效果2:

profile2