facebook工具xhprof的安装与使用-分析php执行性能

简介: 下载源码包的网址 http://pecl.php.net/package/xhprof 上面说了,每个版本适用的php版本。 规划(预先搞清楚思路)一、这是一个php扩展的形式。我们安装gd2,curl都是php的扩展形式。

下载源码包的网址
 
http://pecl.php.net/package/xhprof



上面说了,每个版本适用的php版本。


规划(预先搞清楚思路)



一、这是一个php扩展的形式。我们安装gd2,curl都是php的扩展形式。只不过有的时候编译的时候就安装进去了。
像操作mysql数据库,也是一个mysql.so这样的扩展,安装了扩展,就能调用mysql_query()这些函数。
要操作oracle数据库,也有对应的oracle扩展加到php引擎中去。



现在要把xhprof扩展加到php中去。


很久没使用phpize安装扩展了。我自己忘得差不多了。于是重新去自己的博客找到以前写的文章复习一下。

http://www.cnblogs.com/wangtao_20/archive/2011/03/16/1986508.html




ps:我也在思考,这个东西怎么这么容易忘记。我只知道他的作用。但是完全不记得他的操作步骤。要注意的细节。

看我得想办法以通俗的方式来理解记住它。





二、php.ini需要进行配置的项


[xhprof]
extension=xhprof.so;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
;xhprof.output_dir=<directory_for_storing_xhprof_runs>
;储存 XHProf 运行数据的默认目录
xhprof.output_dir=/tmp/xhprof



三、有了这个扩展后,就能在自己的php代码中调用这个扩展内置的函数来做性能监控了,像下面这样子


xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

................这里是要被监控的代码块


$data = xhprof_disable();

include_once "xhprof_lib/utils/xhprof_lib.php";  
include_once "xhprof_lib/utils/xhprof_runs.php";  
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
$run_id = $objXhprofRun->save_run($data, "test");


=====================================================

几个扩展函数如下




步骤实施


1、先找到我服务器上php的安装目录,phpize一般都是在安装目录中,如下:

/usr/local/php/bin/phpize

2、找出php-config在哪个目录(下面会用到),我的服务器在:

/usr/local/php/bin/php-config

目的:在下面进行编译的时候,会用到这个文件

./configure --with-php-config=/usr/local/php/bin/php-config



3、找到我服务器上php扩展在哪个目录,不确定的话,我觉得去php.ini中也能看到,如下


extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/" 这个路径感觉有点长。不用去改了php.ini中的设置,目前我觉得没必要(商业与时间成本,这部分还不是制约因素)。按原来的继续放扩展。




现在知道扩展目录为:/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

也就是说,我要把xhprof的源码包解压到这个目录下去(解压后会生成一个新的文件夹)。


那我就要去这个目录下运行phpize(这样方便在这个目录下面生成configure文件),

phpize的特点:在a目录下运行phpize,就会在a目录下生成configure。











得到上面路径,shell命令实践



cd  /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

解压下载到的xhprof压缩包(我不是通过wget下载的,我是把这个压缩直接通过ftp上传到no-debug-non-zts-20060613目录中去)。



tar zxf xhprof-0.9.3.tgz               #解压后,里面有个extension文件夹,进入里面去(目的是进入里面去运行phpize),解压后的目录结构如下

 




cd xhprof-0.9.3/extension/            #切换到这个扩展的源码目录去

在这个目录下面运行phpize,就会在extension目录下生成一个configure文件(这是phpize的机制)


/usr/local/php/bin/phpize
 
去看一下扩展目录,会发现在extension目录生成了一个configure文件。运行它


======================================


./configure --with-php-config=/usr/local/php/bin/php-config #用到了前面找到的php-config文件。

make && make install

make test
======================================




运行成功后,会提示生成的xhprof.so文件在哪个位置,提示信息:

Libraries have been installed in:
   /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof-0.9.3/extension/modules


这个目录下已经存在一个文件:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so

 

 



刚才生成了xhprof.so这个模块文件,现在要在php.ini中加载刚才生成xhprof.so模块才能生效:

[xhprof]
extension=xhprof.so;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
;xhprof.output_dir=<directory_for_storing_xhprof_runs>
xhprof.output_dir=/tmp/xhprof






平滑重新加载php.ini文件:/usr/local/php/sbin/php-fpm reload
提示:

Reload service php-fpm  done

说明成功。

现在去phpinfo中看xhprof扩展是否加载成功了






安装作图工具(选填,可以后续再安装)

yum install -y graphviz





================================================

工具的使用实践

================================================

 

index.php中的代码:

 

<?php
error_reporting(-1);


xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
 
$begin_time = microtime_float();




///////////////统计执行速度代码
$end_time = microtime_float();

$exec_time  = $end_time-$begin_time;

//@save_stat($exec_time);

for($i=0;$i<10;$i++){


for($j=0;$j<10;$j++){

}

}



$data = xhprof_disable();

include_once "xhprof_lib/utils/xhprof_lib.php";//从源码包中拷贝xhprof_lib这个文件夹过来直接可以调用
include_once "xhprof_lib/utils/xhprof_runs.php";  
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
$run_id = $objXhprofRun->save_run($data, "test");
//第二个参数是定义文件名称。名称如果为"xhprof",则在xhprof.output_dir设置的目录生成的文件:522ab85f40229.xhprof.xhprof。
//格式为:"id标识.组名称.xhprof",id标识就是$run_id得到的结果。

//id标识是每次运行的时候就生成一个新的标识,也就是生成一个新的文件,记录每次运行的数据





var_dump($run_id);

echo "http://www.xxxx.com/xhprof_html/index.php?run={$run_id}&source=test\n";//source的值必须是save_run中指定的名称。这个其实就是根据编号和名称才能定位到对应的文件"522ab85f40229.xhprof.xhprof"

//将这个地址输出来,是为了直接可以去查看分析结果。




function save_stat($time)
{
    static $call_count=1;
    $call_limit = 10;
    if(!$time) return ;
        $date = date("Y-m-d");//暂时按照天来生成文件。方便查阅
    $exec_stat_file = './exec_stat'.DIRECTORY_SEPARATOR."exec_stat_file-".$date.".txt";
    $fp = fopen($exec_stat_file,'ab');
    if(flock($fp,LOCK_EX))
    {
        $s = 'access:'.date("Y-m-d H:i:s").',execute time:'.$time.'s,request_url:http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."||".PHP_EOL;
        fwrite($fp,$s);
        flock($fp,LOCK_UN);
    }else{
        usleep(1000);
        if($call_count<$call_limit)
        {
            $call_count++;
            save_stat($time);
        }
    }

    @fcolse($fp);
    //var_dump($fp);

}
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
?>

 

加粗的黑体,就是分析用到的代码。

其中用到了源码包中的xhprof_lib中的代码,代码中"XHProfRuns_Default"这个类就是里面的。

 

 

生成了分析结果后,现在可以去使用源码包中提供的web版的工具查看了。

 

xhprof_html这个文件夹随便放到哪里,只要放到能够通过web访问的目录下即可,不过这个里面会用到xhprof_lib中的类,所以还是一起复制过去,跟源码包中保持一样的结构才好。xhprof_html与xhprof_lib要保持平行

 

我这里,这个工具的访问方式是:http://www.xxxx.com/xhprof_html/index.php?run=xxx&source=xxx\n

source的值必须是save_run中指定的名称。这个其实就是根据编号和名称才能定位到对应的文件"522ab85f40229.xhprof.xhprof"

访问看到的结果如下

 

 

 

 

图中,红色的表示最耗费性能的,黄色的其次。

 

 

只了解这么多了。具体的分析结果怎么看,在文件夹xhprof_html中有个docs目录,里面是说明文档。说了一些专用术语的定义

 

注意点:在php.ini中xhprof.output_dir设置的目录,要自己手动去创建。这个工具不会自动去创建。没有该文件夹。就不会生成。另外,在linux下还要保证权限设置好,我设置的属主是www就可以用了。

 

 

 单位:1s(秒)=1000ms(毫秒)

 

 

 

 

 官方解释

  1. Inclusive Time (or Subtree Time): Includes time spent in the function as well as in descendant functions called from a given function.
  2. Exclusive Time/Self Time: Measures time spent in the function itself. Does not include time in descendant functions.
  3. Wall Time: a.k.a. Elapsed time or wall clock time.
  4. CPU Time: CPU time in user space + CPU time in kernel space

Exclusive Time表示函数本身的执行时间。这个时间并不包含里面调用其他函数的耗时(其实就是去掉里面其他函数的耗时,因为函数里面调用到的函数也会进行单独统计)。

Inclusive Time则是包括了里面调用的子函数时间(descendant functions)

所以,我的理解是Exclusive Time<=Inclusive Time

 

 

 

目录
相关文章
|
1月前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
1月前
|
Linux PHP
linux centos7 安装php7.4 实测 遇到的坑
linux centos7 安装php7.4 实测 遇到的坑
106 0
|
1月前
|
消息中间件 网络协议 NoSQL
PHP中的异步编程:提高性能与效率的利器
传统的PHP编程方式在处理大量IO密集型任务时效率较低,随着业务的不断扩张和需求的增加,如何提高PHP应用的性能成为了亟待解决的问题。本文将介绍PHP中的异步编程技术,探讨其在提升性能和效率方面的作用,并通过实例演示其在实际应用中的运用。
22 0
|
2天前
|
编译器 PHP 开发者
PHP 7与PHP 8:新特性与性能改进的探索之旅
【6月更文挑战第19天】本文将深入探讨PHP的两个主要版本——PHP 7和PHP 8,着重分析它们各自引入的新特性以及这些变化如何影响Web开发的性能。我们将从PHP 7的突破性优化讲起,逐步过渡到PHP 8的创新之处,最后比较两者在实际应用中的表现差异。文章旨在为开发者提供一个清晰的升级路径,并帮助他们理解每个版本的性能优势。
|
13天前
|
缓存 Java 编译器
PHP 8的新特性:性能与功能的双重提升
【6月更文挑战第9天】PHP 8携JIT编译器提升性能,引入类型推导和命名参数增强功能。JIT编译器提高执行速度,性能比PHP 7.4提升10%-15%。类型推导增强类型安全性,命名参数提升代码可读性。其他改进包括函数调用优化、垃圾回收机制改进及字符串和数组处理优化,实现性能与功能双重提升,为开发者带来更高效、可靠的PHP体验。
|
8天前
|
存储 Linux PHP
PHP云盘网盘系统源码+快速对接多家云存储+全新一键安装版
快速对接多家云存储,支持七牛、又拍云、阿里云OSS、AWS S3、Onedrive、自建远程服务器,当然,还有本地存储。 自定义主题配色。 图片、音频、视频、文本、Markdown、Ofiice文档 在线预览。 移动端全站响应式布局。 文件、目录分享系统,可创建私有分享或公开分享链接。 用户个人主页,可查看用户所有分享。 多用户系统、用户组支持。 初步完善的后台,方便管理。 拖拽上传、分片上传、断点续传、下载限速(*实验性功能)。 多上传策略,可为不同用户组分配不同策略。 用户组基础权限设置、二步验证。 WebDAV协议支持。
15 2
|
10天前
|
网络协议 Unix 应用服务中间件
PHP-FPM 性能配置优化
该文介绍了PHP-FPM的性能配置优化,包括其工作原理和与Nginx的配合。FastCGI是一种提高CGI效率的协议,PHP-FPM是它的管理器。文章对比了CGI和FastCGI的区别,指出FastCGI更高效,能处理更多请求。接着讨论了php-fpm的进程数调优,包括ondemand(按需创建)、dynamic(动态创建)和static(固定数量)三种模式,以及各自适用场景和参数配置。
24 0
PHP-FPM 性能配置优化
|
17天前
|
Ubuntu PHP
ubuntu php libzip安装 ./configure报错 checking for libzip... not found configure
ubuntu php libzip安装 ./configure报错 checking for libzip... not found configure
|
17天前
|
Ubuntu 关系型数据库 MySQL
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
|
5天前
|
弹性计算 监控 Linux
云服务器 ECS产品使用问题之在使用yum安装PHP相关的包时遇到问题,因为系统中找不到php-mysql和php-imap这两个包,该怎么办
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。