它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。
XHProf 分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。
基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。
也能绘制调用关系图。
XDebug 是一个开放源代码的PHP程序调试器(即一个Debug工具)。
对于本地开发环境来说,进行性能分析 XDebug 是够用了。
但如果是线上环境的话,XDebug 消耗较大,配置也不够灵活。
//源码安装 cd /usr/local/src wget http://pecl.php.net/get/xhprof-0.9.4.tgz tar zxvf xhprof-0.9.4.tgz cd xhprof-0.9.4/extension/ /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install //在 php.ini 末尾新增 [xhprof] extension = xhprof.so xhprof.output_dir = 自定义文件夹(/tmp/xhprof_log) # /tmp/xhprof_log 必须存在且有写入权限 # 如果不加存放目录的话,默认是放在/tmp下面 # 重启 php-fpm 环境
如果PHP安装在了其他位置,可以用 php --ini
来探测
#要修改PHP的配置首先需要知道配置文件在什么位置, #这里可以通过PHP的命令来查看配置文件存放位置,参考命令如下: [root@Dev_Test bin]$php --ini Configuration File (php.ini) Path: /Data/apps/php-7.2.8/etc Loaded Configuration File: /Data/apps/php-7.2.8/etc/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none) #验证XHProf模块安装成功与否 php -m | grep xhprof
//比如项目地址:local.test_xhprof.com //在项目入口文件中新增一下代码(CI框架为例) //启动xhprof xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); register_shutdown_function(function(){ $data = xhprof_disable(); //返回运行数据 //xhprof_lib 在下载的包里存在这个目录,记得将目录包含到运行的php代码中 include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_lib.php'; include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_runs.php'; $objXhprofRun = new XHProfRuns_Default(); $objXhprofRun->save_run($data, "test"); //test 表示文件后缀 }); //一切顺利的话,那么代码安装成功。 //访问:local.test_xhprof.com,应该在 /tmp/xhprof_log 存在日志文件。
//将 xhprof_html、xhprof_lib 拷贝到虚拟目录中 cd /usr/local/src cp xhprof-0.9.4/xhprof_html /home/www/mi/xhprof/xhprof_html cp xhprof-0.9.4/xhprof_lib /home/www/mi/xhprof/xhprof_lib
配置虚拟主机(local.xhprof.com)
local.xhprof.com 指向 /home/www/mi/xhprof/ 即可。
访问:local.xhprof.com/xhprof_html 会显示日志文件。
如果要生成图,那在生成图的时候需要服务器装一个插件:graphviz
。
cd /usr/local/src wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz tar zxvf graphviz-2.24.0.tar.gz cd graphviz-2.24.0 ./configure make make install
报错:failed to execute cmd " dot -Tpng",表示:php.ini 中一些执行函数禁用了。在 php.ini 中 去掉 disable_functions 中的如下函数
system shell_exec proc_open proc_get_status #重启PHP
以上,大家可以看到 PHP 函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。
扩展阅读:
<?php function bar($x) { if ($x > 0) { bar($x -1); } } function foo() { for ($idx = 0; $idx < 5; $idx++) { bar($idx); $x = strlen("abc"); } } //启动xhprof xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); //调用foo函数,也是我们要分析的函数 foo(); //停止xhprof $xhprof_data = xhprof_disable(); //取得统计数据 print_r($xhprof_data); $XHPROF_ROOT = realpath(dirname(__FILE__) . '/..'); include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; //保存统计数据,生成统计ID和source名称 $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo"); //source名称是xhprof_foo //查看统计信息 header("Location: ../xhprof_html/index.php?run=".$run_id."&source=xhprof_foo"; ?>
以下是部分的结果:
[foo==>bar] => Array ( [ct] => 5 //bar()这个函数被调用了5次 [wt] => 63 //每次运行bar()所要的时间,不知道这个是不是平均值 [cpu] => 0 //每次运行bar(),cpu运算时间 [mu] => 2860 //每次运行bar(),php所使用内存的改变 [pmu] => 0 //每次运行bar(),php在内存使用最高峰时,所使用内存的改变 )