当前位置: 首页 > 后端技术 > PHP

使用XHProf分析PHP性能瓶颈(一)

时间:2023-03-30 02:02:00 PHP

安装xhprof扩展wgethttp://pecl.php.net/get/xhprof-0.9.4.tgztarzxfxhprof-0.9.4.tgzcdxhprof-0.9.4/extension/sudophpize./configuresudomakesudomakeinstallcd../configurephp.ini[xhprof]extension=xhprof.soxhprof.output_dir=/tmp注意:xhprof已经很久没有更新了,目前还不支持php7,php7可以使用https://github.com/phacility/...。配置xhprof环境需要将xhprof压缩包中的两个目录复制到指定目录下(假设定义为/work/xhprof/):mkdir/work/xhprof/cp-axhprof_html//work/xhprof/cp-axhprof_lib//work/xhprof/然后在项目框架的入口文件中添加:){fastoncgi_finish_request'){"fastoncgi_finish_request"/work/xhprof/xhprof_lib/utils/xhprof_lib.php";include_once"/work/xhprof/xhprof_lib/utils/xhprof_runs.php";$xhprof_runs=newXHProfRuns_Default();$run_id=$xhprof_runs->save_run($xhprof_data,'xhprof');});代码分析:$xhprof_data记录了程序运行过程中所有的函数调用时间和CPU内存消耗,具体记录了哪些指标可以通过参数控制xhprof_enable.目前支持的d参数是:HPROF_FLAGS_NO_BUILTINS跳过所有内置(固有)函数。将CPU数据添加到XHPROF_FLAGS_CPU输出的性能数据中。将内存数据添加到XHPROF_FLAGS_MEMORY输出的性能数据中。后续处理与xhprof扩展无关。大致就是写一个存储类XHProfRuns_Default,将$xhprof_data序列化保存到某个目录,通过XHProfRuns_Default(__DIR__)将结果输出到当前目录。如果不指定,会读取.ini配置文件中的phpxhprof.output_dir,仍然不指定,会输出到/tmp。xhprof_enable和xhprof_disable成对出现,一个在代码前面,一个在最后。中间是要分析的代码。经过以上配置后,当我们后续请求该项目的接口时,xhprof会分析请求过程中的CPU、内存、耗时等内容。日志保存在xhprof.output_dir目录中。配置web配置,如何查看日志?我们可以构建一个简单的Web服务器:xhprof.test.com.confserver{listen80;服务器名称xhprof.test.com;根/work/xhprof/xhprof_html;indexindex.htmlindex.php;位置~\.php${fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;包括fastcgi_params;}}然后配置虚拟主机xhprof.test.com。重启nginx,打开xhprof.test.com看看效果:默认的UIlists:funcitonname:functionnamecalls:numberofcallsIncl.WallTime(microsec):函数运行时间(含子函数)IWall%:函数运行时间(含子函数)Excl.WallTime(microsec):函数运行时间(不包括子函数)EWall%:函数运行时间(不包括子函数)网页上也可以看到【ViewFullCallgraph】链接,之后可以画出可视化的性能分析图点击,如果点击后报错,可能是对graphviz没有依赖。graphviz是一个绘图工具,可以让你更直观的查看性能瓶颈。如果需要,可以安装:yuminstall-ylibpngyuminstall-ygraphviz作用:非侵入式引入xhprof我们通过在项目入口文件中添加代码实现分析功能。更优雅的方法是创建一个额外的文件xhprof.inc.php并将其保存在/work/xhprof/目录中:('fastcgi_finish_request')){fastcgi_finish_request();}include_once"/work/xhprof/xhprof_lib/utils/xhprof_lib.php";include_once"/work/xhprof/xhprof_lib/utils/xhprof_runs.php";$xhprof_runs=newXHProfRuns_;$run_id=$xhprof_runs->save_run($xhprof_data,'xhprof');});在执行代码之前使用PHP的自动加载功能注入这个文件,编辑php.ini:auto_prepend_file=/work/xhprof/xhprof。inc.php然后重启PHP服务。这样,凡是使用php环境的都会生效。或者写入指定项目的nginx配置:jifen.cc.conflocation~\.php${fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_paramPHP_VALUE"auto_prepend_file=/work/xhprof/xhprof.inc.php";包括fastcgi_params;}然后重启nginx服务。这样只有该项目生效。通过auto_prepend_file和auto_append_file包含的文件在这种模式下被解析,但有一些限制,例如函数必须在调用之前定义。修改采样频率。默认情况下,xhprof每次都会运行。如果在线上环境设置这个,会对性能有影响。xhprof.inc.phpsave_run($xhprof_data,'xhprof');}});总结在这篇文章中,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志中,最终使用xhprof扩展自带的UI来展示在web上。主要知识点:安装xhprof扩展,将xhprof注入应用,基于nginx显示分析结果。PHP性能瓶颈-程序员成长计划-SegmentFault思考https://segmentfault.com/a/11...三、PHP性能跟踪分析工具xhprof的安装与使用-马新才的技术博客-SegmentFault思考https://segmentfault.com/a/11...4、Tideways与xhgui打造PHP非侵入式监控平台|,原文发表于公众号飞鸿影博客(fhyblog)和博客园,转载需征得作者同意。