php轻量级的性能分析工具xhprof的安装使用
一、前言有用的东西还是记录下来吧,也方便以后的查询;这次记录一下xhprof的安装使用; xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, 还可以用在生产环境中,也可以由程序开 关来控制是否进行profile。 二、安装(会自动将生成的扩展文件拷贝到扩展目录中/usr/lib64/php/modules) 当然具体的php文件的目录,每个人不尽相同,可根据phpinfo查询 三、php.ini配置根据phpinfo找到 extension_dir的目录 (/etc/php.d/xhprof.ini) 添加一下内容: 四、重启服务查看phpinfo是否安装成功 五、使用方法//要测试的代码
... ... ... 结尾: 上边的代码使用了,给xhprof设置虚拟主机的方法。 把源码包中的 xhprof_html 和 xhprof_lib 文件夹拷贝到自己建立的虚拟目录中 cp -r xhprof_html xhprof_lib /xxx/xhprof/ (此处目的是建立数据分析目录,可将此目录配置成虚拟主机访问) 运行后,统计点击返回的 xhprof统计 链接,即可。 六、注意问题以及名词解释在显示的统计页面中,点[View Full Callgraph]图形化显示(最大的性能问题会用红色标出,其次是黄色); 点击后,可能提示错误消息,执行以下命令即可 名词解释 <div class="jb51code"> xhprof的安装与简易用法xhprof是Facebook开源的轻量级PHP性能分析工具,Linux环境下可以通过pecl直接安装,比如在Ubuntu下仅需3行指令 /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart
之后可以通过phpinfo()检查扩展是否已经加载。 具体如何使用呢,xhprof项目中已经提供了示例以及简易的UI,下载xhprof项目到web服务器,假设可以通过访问,那么访问可以看到一些输出,并且提示通过访问/index.php?run=XXX&source=xhprof_foo">http:// 分析一下示例代码sample.php,关键部分只有2行: $xhprof_data中记录了程序单步运行过程中所有的函数调用时间及CPU内存消耗等,具体记录哪些指标可以通过xhprof_enable的入口参数控制,之后的处理已经与xhprof扩展无关,大致是编写了一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp。 xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了: •funciton name : 函数名 •calls: 调用次数 •Incl. Wall Time (microsec): 函数运行时间(包括子函数) •IWall%:函数运行时间(包括子函数)占比 •Excl. Wall Time(microsec):函数运行时间(不包括子函数) •EWall%:函数运行时间(不包括子函数) 每一项应该不难理解,以项目自带的sample.php为例,示例中编写了一个main()函数,main()函数中调用foo()、bar()等一些子函数进行了一点字符处理。整个程序运行过程中,main()函数只运行了一次,并且由于main()函数中包括了所有的逻辑,所以main()函数的IWall%占比为100%,但是由于main()函数的功能都是由子函数实现的,因此main()函数的EWall%只有0.3%,而foo()函数完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序时,往往需要根据这几项指标分别排序,从不同的角度审视性能消耗。 在xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,ubuntu可以通过apt安装 apt-get install graphviz 更好的注入方式了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑 //让数据收集程序在后台运行
if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } //保存xhprof数据 但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件 修改auto_prepend_file配置 这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件 如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |