利用PHP扩展Xhprof分析项目性能实践教程

一、背景

项目即将上线,想通过一些工具来分析代码的稳定性和效率,想起在上个团队时使用过的xhprof扩展;因为换了新电脑,所以需要重新编译此扩展,现将安装与实际排查过程完整记录下来,方便自己回顾和帮助更多的读者。

XHProf 是 FaceBook 开发的一个函数级别的 PHP 分层分析器。

数据收集部分是一个基于 C 的 PHP 扩展,分析报告是一系列基于 PHP 的 HTML 导航页面

XHProf 能统计每个函数调用次数、内存使用、cpu占用等多项重要的数据。

并且 XHProf 还能比较两个统计样本,或从多个数据样本中汇总结果。

XHProf 是分析 PHP 程序执行效率的利器,能让我们得到更底层的的分析数据。

下面话不多说了,来一起看看详细的介绍吧

二、操作步骤

  • 安装扩展
  • 配置扩展
  • 测试分析

三、安装

xhprof扩展PHP并不自带,需要笔者去单独安装它,安装之后才能使用,笔者这里采用源码安装方式,安装过程如下

3.1 下载源码

xhprof在PHP的PECL官方上面已经比较老了,笔者的PHP版本为PHP7.1因此,需要在GitHub上下载xhprof上比较新的源码,参考命令如下

3.2 检测环境

进入编译的文件夹,参考命令

现在笔者需要编译一下源码,在编译之前可以使用PHPze来探测PHP的环境,参考命令如下:

PHPize

返回结果如下

Configuring for: PHP Api Version: 20160303 Zend Module Api No: 20160303 Zend Extension Api No: 320160303

3.3 编译安装

生成 Makefile,为下一步的编译做准备

返回结果如下

creating libtool appending configuration tag "CXX" to libtool configure: creating ./config.status config.status: creating config.h config.status: config.h is unchanged

开始编译,并进行安装

返回结果如下

Build complete. Don't forget to run 'make test'.

Installing shared extensions: /usr/local/Cellar/php@7.1/7.1.19/pecl/20160303/

从返回信息中可以看到已经安装完成,并显示了扩展文件存放的位置

四、配置

在编译安装源码之后,笔者还需要对PHP配置文件夹以及xhprof的进行一些简单的配置,操作过程如下所示

4.1 找出配置文件位置

修改PHP的配置首先需要知道配置文件在什么位置,这里可以通过PHP的命令来查看配置文件存放位置,参考命令如下:

PHP --ini

执行命令后,返回结果如下

Configuration File (PHP.ini) Path: /usr/local/etc/PHP/7.1 Loaded Configuration File: /usr/local/etc/PHP/7.1/PHP.ini Scan for additional .ini files in: /usr/local/etc/PHP/7.1/conf.d Additional .ini files parsed: /usr/local/etc/PHP/7.1/conf.d/ext-opcache.ini

在返回结果当中,可以看到多个配置文件的路径,笔者所需要的是第二个文件PHP.ini

查看扩展目录存放位置,参考命令如下

PHP/7.1/PHP.ini | grep extension_dir

返回结果如下

extension_dir = "/usr/local/lib/PHP/pecl/20160303" ; extension_dir = "ext" ; Be sure to appropriately set the extension_dir directive. ;sqlite3.extension_dir =

4.2 修改配置

从返回的结果当中,可以看到扩展的存放目录位置如下

/usr/local/lib/PHP/pecl/20160303

现在需要将刚才编译好的xhprof扩展复制到该目录当中,参考命令如下

PHP@7.1/7.1.19/pecl/20160303/xhprof.so /usr/local/Cellar/PHP@7.1/7.1.19/pecl/20160303/

通过vim编辑器编辑配置文件,参考命令如下

PHP/7.1/PHP.ini

配置文件尾部增加xhprof的配置,以及自定义一个用来保存xhprof生成的源文件参考配置如下

4.3 重启生效

保存好之后,笔者重启PHP-fpm让其配置生效,重启命令可以通过brew命令来查看,参考命令如下:

PHP@7.1

在命令执行后,返回的信息中可以看到如下信息

PHP@7.1 now and restart at login: brew services start PHP@7.1 Or,if you don't want/need a background service you can just run: PHP-fpm

因此笔者构造的重启PHP-FPM命令如下:

PHP@7.1

重启完成后,返回结果如下

Successfully stopped `PHP@7.1` (label: homebrew.mxcl.PHP@7.1) ==> Successfully started `PHP@7.1` (label: homebrew.mxcl.PHP@7.1)

4.4 验证安装

现在验证xhprof扩展是否已经安装完成,参考命令如下

PHP -m | grep xhprof

命令执行后,安装扩展成功的返回结果将会显示xhprof,如下图所示

五、测试

经过上面的操作笔者已经成功的安装与配置,现在需要用PHP代码来进行验证xhprof的分析效果

5.1 创建虚拟主机

首先创建一个虚拟主机,让用户可以通过浏览器访问所访问,创建虚拟主机需要有一个根目录,并编辑Nginx配置文件,具体操作如下:

5.1.1 创建项目目录

创建项目根目录,参考命令如下

创建成功之后,笔者需要将之前git拉下来的部分代码复制到项目根目录当中,参考命令如下

5.1.2 编辑配置文件

添加配置文件,参考命令

Nginx/Nginx.conf

添加配置文件如下

root /Users/song/mycode/work/test;
index index.html index.htm index.PHP;

location / {
try_files $uri $uri/ /index.PHP?$query_string;
}

location ~ .PHP$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.PHP;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}

在/etc/hosts文件增加入一行解析记录,记录内容如下:

5.2 新建测试代码

在git仓库的examples文件夹下,已经有了一份demo代码,不过这份代码的注释都是英文,而且排版方式也不易笔者自己理解,因此笔者重新编辑了此文件,参考步骤如下命令

使用vim新建一个PHP文件

PHP

文件中加入以下代码

PHP;"> PHP

//加载所需文件
include_once "./xhprof_lib/utils/xhprof_lib.PHP";
include_once "./xhprof_lib/utils/xhprof_runs.PHP";

//随意定义一个函数
function test($max)
{
for ($idx = 0; $idx < $max; $idx++) {
echo '';
}
}

//定义测试方法
function a()
{
test(rand(1000,5000));
}

//开始分析
xhprof_enable();

//需要分析的函数
a();

//结束分析
$xhprof_data = xhprof_disable();
//实例化xhprof类
$xhprof_runs = new XHProfRuns_Default();
//获取当前当前页面分析结果
$run_id = $xhprof_runs->save_run($xhprof_data,"xhprof_foo");

echo "\nhttp://test.localhost/xhprof/xhprof_html/index.PHP?run=$run_id&source=xhprof_foo\n";

保存代码之后,通过浏览器访问对应的URL地址URL地址如下所示

http://test.localhost/xhprof/test.PHP

5.3 结果分析

运行后结果,如下图

页面中可以看到一个URL地址,复制并打开此URL地址之后,便能看到此代码的分析结果,如下图所示

页面中有一个列表,展示了每一个方法所消耗的时间,如果觉得列表的方式表示不够清晰,点击页面中的 View Full Callgraph 链接可以直接生成一个图片,如下图所示

在图中很清晰的可以看到执行时间都消耗在test方法上,因此笔者可以针对这个方法进行针对性的优化。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...