PHP:使用xdebug profiler 作性能分析

PHP:使用xdebug profiler 作性能分析
转自:https://zhuanlan.zhihu.com/p/26615449
PHP:使用xdebug profiler 作性能分析

PHP:使用xdebug profiler 作性能分析

Cailiang Cailiang
做为PHP程序员咱们或多或少都了解或使用过xdebug。咱们最经常使用的可能就是使用它和一些IDE配合,来实现断点调试的功能。但xdebug还有不少颇有用的功能,好比它能够将项目的运行流程输出到日志,并记录内存使用,执行时间等信息。还提供一些内置的方法好比咱们经常使用的xdebug_debug_zval,打印变量结构的相关信息。还有咱们今天要用到的 profiler,能够检测项目的性能,找到瓶颈所在。下面咱们经过一个例子来学习profiler的用法。

咱们的测试环境是 Mac, php71, 安装也很简单:php

brew install php71; brew install homebrew/php/php71-xdebugreact

经过 brew 安装的咱们能够在 /usr/local/etc/php/7.1/conf.d 目录下找到xdebug扩展的配置文件,咱们须要添加 profiler 的相关配置:程序员

xdebug.profiler_output_dir 很明显是用于存放生成的文件的路径
ajax

xdebug.profiler_enable profiler功能的开关,默认值0,若是设为1,则每次请求都会生成一个性能报告文件。thinkphp

xdebug.profiler_enable_trigger 默认值也是0,若是设为1 则当咱们的请求中包含XDEBUG_PROFILE参数时才会生成性能报告文件。例如http://localhost/index.php?XDEBUG_PROFILE=1(固然咱们必须关闭xdebug.profiler_enable)。使用该功能就捕获不到页面发送的ajax请求,若是须要捕获的话咱们就可使用xdebug.profiler_enable功能。json

xdebug.profiler_output_name 生成的文件的名字,默认 cachegrind.out.%t.%p浏览器

配置好后,咱们就能够开始尝试了,好比咱们基于thinkphp5写了一个测试程序,性能优化

 public function t()
 {
 $p = $this->request->param();
 $this->t1();
 $this->t2();
 $this->t3();
 $this->t1();
 $this->t1();
 return json($p);
 }

 public function t1()
 {
 for ($i = 0; $i < 3; $i++) {
 sleep(1);
 }
 }

 public function t2()
 {
 for ($i = 0; $i < 5; $i++) {
 sleep(1);
 }
 }

 public function t3()
 {
 for ($i = 0; $i < 8; $i++) {
 sleep(1);
 }
 }

而后经过浏览器访问一下。OK,咱们再去咱们配置的 xdebug.profiler_output_dir 目录下面查看一下,看到有一些文件生成了。固然这些文件咱们直接看可能很费劲,咱们须要借助一些图形化的分析工具---qcachegrind(Mac上咱们用这个,若是是Linux就用 kcachegrind) , 在Mac上咱们直接用 brew install graphviz; brew install qcachegrind 安装就行。可是 做分析的时候 "Call Graph" 功能可能用不了。后来找到这篇文章How to install qcachegrind (kcachegrind) on Mac OSX Snow Leopard 有解决的办法:php7

sudo ln -s /usr/local/bin/dot /usr/bin/dot
thinkphp5

用 qcachegrind 打开生成的文件,能够看到下面的结果:

经过图形化的页面咱们能一目了然的看到咱们的程序执行的流程,和一些方法的耗时,点击到某个具体的方法能够看到更详细的信息,好比咱们想要查看t方法的执行过程,咱们先点击t方法,看右上方的 SourceCode,能够看到该方法的源代码,以及它调用的其它方法的耗时状况。 下方的框,咱们切换到 CallGraph 能够图形化的看到,每一个方法的调用次数及耗时。

经过这个图咱们一眼就能发现t方法的耗时最终都在 php的sleep方法上面。是否是有简单,又高效。qcachegrind 还有不少其它的功能,欢迎留言分享。

尚未评论
苑葩
写下你的评论...




相关文章
相关标签/搜索