php扩展xhprof实践分析项目性能

我是阿沐 · · 412 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。”

1 前言

大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。

今天这篇文章是我在2018年博客上写的,种种原因博客已不复存在。讲这篇文章的主要原因是因为之前在公司使用过,而且得到了很好的性能调优,最重要的是发现了问题解决了问题,kpi就会高,money嗖嗖的来了,哈哈......

目前我从事于golang、lua语言开发,当然PHP是老本行并没有落下,时不时的还用PHP帮别人写写东西,所以主要文章还是以php相关为主。后期的话会开展redis、mysql、openresty+nginx、docker、lua的在nginx层的使用以及实践

3 安装

安装前的准备工作

➜  ~ php  -v
PHP 7.2.4 (cli) (built: Mar 29 2018 15:19:46) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.4, Copyright (c) 1999-2018, by Zend Technologies

PECL官方版本地址连接:
http://pecl.php.net/package/xhprof

pecl扩展截图

从上图可以看出18年以前没有在更新,版本很老,19年以后开始逐渐更新。3月31日又更新一波,看来还是很给力的嘛!

Github地址:
https://github.com/longxinH/xhprof

3.1下载源码安装

cd /usr/local/var/www/mumu_test

git clone https://github.com/longxinH/xhprof.git

Cloning into 'xhprof'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 854 (delta 10), reused 18 (delta 5), pack-reused 822
Receiving objects: 100% (854/854), 1.89 MiB | 417.00 KiB/s, done.
Resolving deltas: 100% (454/454), done.

3.1.1 跟着官方文档走,检查环境

进入编译的文件夹,本机地址如下:
➜ extension git:(master) pwd
/usr/local/var/www/mumu_test/xhprof/extension
➜ extension git:(master)

编译源码前使用phpize检测下PHP环境,本机命令如下:

➜  extension git:(master) phpize
Configuring for:
PHP Api Version:         20170718
Zend Module Api No:      20170718
Zend Extension Api No:   320170718

3.1.2 编译安装

./configure

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
➜ extension git:(master)

make && make install


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

Installing shared extensions: /usr/local/Cellar/php/7.2.4/pecl/20170718/
➜ extension git:(master)

第一步生成 Makefile,下一步开始编译安装,输出扩展文件的存放位置。

4 配置xhprof环境

4.1 查询本机php.ini的配置地址

➜ extension git:(master) php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/7.2
Loaded Configuration File: /usr/local/etc/php/7.2/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.2/conf.d
Additional .ini files parsed: /usr/local/etc/php/7.2/conf.d/ext-opcache.ini

查看php的扩展存放地址:

➜  extension git:(master) grep extension_dir /usr/local/etc/php/7.2/php.ini
extension_dir = "/usr/local/lib/php/pecl/20170718"
; extension_dir = "ext"
;   Be sure to appropriately set the extension_dir directive.
;sqlite3.extension_dir =

从上面的结果看,xhprof的编译生成的扩展位置跟php本身的扩展位置不在同一个目录中

4.2 配置xhprof.so扩展+输出目录

➜ extension git:(master) cp /usr/local/Cellar/php/7.2.4/pecl/20170718/xhprof.so /usr/local/lib/php/pecl/20170718/

cp: /usr/local/lib/php/pecl/20170718/xhprof.so and /usr/local/Cellar/php/7.2.4/pecl/20170718/xhprof.so are identical (not copied).
复制报错,显示是复制的文件完全相同,推断出编译的时候已经在php扩展文件生成了该扩展,

那么我们配置文件尾部增加xhprof的配置:
➜ extension git:(master) vim /usr/local/etc/php/7.2/php.ini
➜ extension git:(master) grep xhprof /usr/local/etc/php/7.2/php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir=/data

重启php:
➜ extension git:(master) brew services restart php
Stopping php... (might take a while)
==> Successfully stopped php (label: homebrew.mxcl.php)
==> Successfully started php (label: homebrew.mxcl.php)

4.3 检查xhprof扩展是否安装成功

➜ extension git:(master) php -m | grep xhprof
xhprof

或者:


phpinfo输出查看

编码实践

我们在刚刚git下载的同级目录创建一个测试test目录并创建index.php
➜ mumu_test pwd
/usr/local/var/www/mumu_test
➜ mumu_test ll
total 0
drwxr-xr-x 3 xxx xxx 96B 4 10 17:34 test
drwxr-xr-x 22 xxx xxx 704B 4 10 16:24 xhprof
➜ mumu_test ll test
total 8
-rw-r--r-- 1 xxx xxx 23B 4 10 17:13 index.php

cp -r xhprof/xhprof_html test --复制对应的扩展类到项目目录
cp -r xhprof/xhprof_lib test --复制对应的输出配置到项目目录

添加代码:
vim test/index.php

<?php
//加载xhprof所需文件
 include_once "./xhprof_lib/utils/xhprof_lib.php";
 include_once "./xhprof_lib/utils/xhprof_runs.php";

// 实例化redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//echo "Server is running: " . $redis->ping();

$redis->set('test', 1);

 $time = time();

 //开始分析
 xhprof_enable();

 for ($i = 0; $i < 100; $i++) {
     $redis->get('test');
 }

 $redis->delete('test');

 //结束分析
 $xhprof_data = xhprof_disable();

 //实例化xhprof类
 $xhprof_runs = new XHProfRuns_Default();

 //获取当前当前页面分析结果
 $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

 echo sprintf('共用了%u时间,分析结果生成id为%s', time() - $time, $run_id);

配置站点访问

脚本代码我们已经写好,那么需要我们配置站点访问:

server {
        listen       80;
        server_name  www.xhprof.com;

        root   /usr/local/var/www/mumu_test/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;
        }

    }

访问虚拟主键www.xhprof.com

输出结果:共用了0时间,分析结果生成id为60717fee13ab3

访问本地配置的目录:http://www.xhprof.com/xhprof_html/

所有run_id性能分析结果

点击run_id展示详细性能分析信息分析:


具体信息块

性能分析图字段解析

  1. funciton name : 函数名
  2. calls: 调用次数
  3. Incl. Wall Time (microsec): 函数运行时间(包括子函数)
  4. IWall%:函数运行时间(包括子函数)占比
  5. Excl. Wall Time(microsec):函数运行时间(不包括子函数)
  6. EWall%:函数运行时间(不包括子函数)占比率

当使用xhprof_disable完成性能分析并且获取到分析结果之后,它只是显示一个总体的结果,但是这样的结果看起来并不够直观,不够详细,我们并不能看到到底是代码哪一个环节出了问题。xhprof也想到了这一艾丹,为我们提供了基于web的图形界面对分析结果进行查看,点击页面上[View Full Callgraph]查看:

然后就报错误了,原因是我们未安装对应的依赖类库:

failed to execute cmd: " dot -Tpng". stderr: sh: dot: command not found

安装graphviz

本机mac:brew install graphviz
centos: yum install graphviz

具体信息,本地数据不多

关于xhprof类的调用讲解

  1. xhprof_enable分析数据开始(类似mysql的事务),xhprof_disable整个分析代码块结束之后,它们两个中间就是要分析的数据。
  2. XHProfRuns_Default存储数据的类,将收集到的结果放入指定目录。例如传了xxx,则会输出指定目录,否则将自动读取php.ini配置文件中的xhprof.output_dir路径,未配置则输出到临时文件夹中。
  3. 注意根据分析图了解redis耗时点、cpu、mysql请求查询量等等指标,对应的去优化
  4. 尽量不要在项目开始就引入,请求量大的情况下,会影响到我们的服务器性能,磁盘等问题;尽量针对代码块做检测

最后总结

以上整体就是对xhprof扩展的安装、配置、使用进行操作介绍;如何利用xhprof来分析php代码性能,如何存储结果集,如何展示出来。希望大家一定要动手实际操作一遍,中小型项目中未使用到的可以尝试引入。你的kpi或许在这个时候就有的写了。

小伙伴们,虽然xhprof网络上已经泛滥了,但是并不影响我们对它的进一步总结。如果有用可以来一波留言:有点意思

我是阿沐,你点的每个好看,我都认真的当成了喜欢;感谢各位小伙伴的:收藏、点赞、分享和留言,我们下期再见。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:我是阿沐

查看原文:php扩展xhprof实践分析项目性能

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

412 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传