> 백엔드 개발 > PHP 튜토리얼 > PHP 경량 성능 분석 도구 xhprof_php 설치 및 사용 팁

PHP 경량 성능 분석 도구 xhprof_php 설치 및 사용 팁

WBOY
풀어 주다: 2016-05-16 20:08:34
원래의
1210명이 탐색했습니다.

1. 서문

나중에 문의할 수 있도록 유용한 내용을 기록하는 것이 좋습니다. xhprof의 설치 및 사용을 기록하세요.

프로덕션 환경에서도 사용할 수 있으며, 프로그램 스위치를 사용하여 프로파일링 여부를 제어할 수도 있습니다.

2. 설치

  wget http://pecl.php.net/get/xhprof-0.9.3.tgz 
  tar zxf xhprof-0.9.3.tgz 
  cd xhprof-0.9.3/extension
  /usr/bin/phpize 
 (php版本安装后生成的phpize文件,可根据phpinfo查看,所以php版本不同,生成的phpize也不同,此步骤主要生成configure文件)
  ./configure –with-php-config=/usr/bin/php-config 
 (php-config的路径,也是php安装后生成的文件) 
  make 
  sudo make install 
로그인 후 복사
(생성된 확장 파일은 자동으로 확장 디렉터리 /usr/lib64/php/modules에 복사됩니다.)

물론 php 파일의 구체적인 디렉터리는 사람마다 다릅니다. phpinfo에 따라 쿼리할 수 있습니다.

3. php.ini 구성

phpinfo에 따라 Extension_dir 디렉토리를 찾으세요

(/etc/php.d/xhprof.ini)


콘텐츠 추가:

extension=xhprof.so
xhprof.output_dir=/tmp/xhprof //xhprof的分析日志

로그인 후 복사
4. 서비스 다시 시작

 sudo /etc/init.d/http restart

로그인 후 복사
phpinfo가 성공적으로 설치되었는지 확인하세요

5. 사용방법

开头:
xhprof_enable(); //开启监测 
//xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 不记录内置的函数 
//xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 同时分析CPU和Mem的开销 

//要测试的代码
...
...
...

结尾:
$xhprof_data = xhprof_disable(); //停止监测,返回运行数据
$xhprof_root = '/(xhprof的虚拟主机目录)/'; 
 //引入当初安装到xhprof虚拟主机目录中的文件
include_once $xhprof_root."xhprof_lib/utils/xhprof_lib.php"; 
include_once $xhprof_root."xhprof_lib/utils/xhprof_runs.php";  
$xhprof_runs = new XHProfRuns_Default();  
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof");
echo '<a href="http://(xhprof的虚拟主机域名)/xhprof_html/index.php&#63;run='.$run_id.'&source=xhprof" target="_blank">xhprof统计</a>'; 

로그인 후 복사
위 코드는 xhprof에 대한 가상 호스트를 설정하는 방법을 사용합니다.

소스 패키지의 xhprof_html 및 xhprof_lib 폴더를 생성한 가상 디렉터리에 복사합니다

cp -r xhprof_html xhprof_lib /xxx/xhprof/ (여기서의 목적은 액세스를 위한 가상 호스트로 구성할 수 있는 데이터 분석 디렉터리를 설정하는 것입니다.)

실행 후 반환된 xhprof 통계 링크를 클릭하여 통계를 확인하세요.

6. 주의사항 및 용어설명

표시된 통계 페이지에서 [전체 호출 그래프 보기]를 클릭하면 그래픽이 표시됩니다(가장 큰 성능 문제는 빨간색으로 강조 표시되고 이어서 노란색으로 강조 표시됩니다).

클릭하면 오류 메시지가 나타날 수 있습니다.

 yum install -y graphviz
 yum install graphviz-gd

로그인 후 복사
용어설명

Function Name 函数名
 Calls 调用次数
 Calls% 调用百分比
 Incl. Wall Time (microsec) 调用的包括子函数所有花费时间 以微秒算(一百万分之一秒)
 IWall% 调用的包括子函数所有花费时间的百分比
 Excl. Wall Time (microsec) 函数执行本身花费的时间,不包括子树执行时间,以微秒算(一百万分之一秒)
 EWall% 函数执行本身花费的时间的百分比,不包括子树执行时间
 Incl. CPU(microsecs) 调用的包括子函数所有花费的cpu时间。减Incl. Wall Time即为等待cpu的时间
 减Excl. Wall Time即为等待cpu的时间
 ICpu% Incl. CPU(microsecs)的百分比
 Excl. CPU(microsec) 函数执行本身花费的cpu时间,不包括子树执行时间,以微秒算(一百万分之一秒)。
 ECPU% Excl. CPU(microsec)的百分比
 Incl.MemUse(bytes) 包括子函数执行使用的内存。
 IMemUse% Incl.MemUse(bytes)的百分比
 Excl.MemUse(bytes) 函数执行本身内存,以字节算
 EMemUse% Excl.MemUse(bytes)的百分比
 Incl.PeakMemUse(bytes) Incl.MemUse的峰值
 IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比
 Excl.PeakMemUse(bytes) Excl.MemUse的峰值
 EPeakMemUse% EMemUse% 峰值百分比
로그인 후 복사
xhprof 설치 및 간단한 사용법

xhprof는 Facebook의 경량 오픈 소스 PHP 성능 분석 도구입니다. Linux 환경에서는 pecl을 통해 직접 설치할 수 있습니다. 예를 들어 Ubuntu에서는 3줄의 명령만 필요합니다.


pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart
로그인 후 복사
나중에 phpinfo()를 통해 확장 프로그램이 로드되었는지 확인할 수 있습니다.

구체적으로 사용하는 방법은? xhprof 프로젝트에서 예제와 간단한 UI를 제공하고 있습니다.

http://localhost/xhprof/

를 통해 xhprof 프로젝트를 다운로드하세요. 그런 다음 http://localhost/xhprof/examples/sample.php를 방문하세요.일부 출력을 볼 수 있으며, http://결과를 확인하세요. 그런 다음 http://localhost/xhprof/xhprof_html/을 방문하여 저장된 결과를 확인하고 모든 함수 호출과 소요 시간을 나열하세요.

샘플 코드 샘플.php를 분석해 보면 핵심 부분은 단 2줄입니다:


//开启xhprof并开始记录
xhprof_enable();
//运行一些函数
foo();
//停止记录并取到结果
$xhprof_data = xhprof_disable();
로그인 후 복사

$xhprof_data中记录了程序单步运行过程中所有的函数调用时间及CPU内存消耗等,具体记录哪些指标可以通过xhprof_enable的入口参数控制,之后的处理已经与xhprof扩展无关,大致是编写了一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp。

xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了:
•funciton name : 函数名
•calls: 调用次数
•Incl. Wall Time (microsec): 函数运行时间(包括子函数)
•IWall%:函数运行时间(包括子函数)占比
•Excl. Wall Time(microsec):函数运行时间(不包括子函数)
•EWall%:函数运行时间(不包括子函数)

每一项应该不难理解,以项目自带的sample.php为例,示例中编写了一个main()函数,main()函数中调用foo()、bar()等一些子函数进行了一点字符处理。整个程序运行过程中,main()函数只运行了一次,并且由于main()函数中包括了所有的逻辑,所以main()函数的IWall%占比为100%,但是由于main()函数的功能都是由子函数实现的,因此main()函数的EWall%只有0.3%,而foo()函数完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序时,往往需要根据这几项指标分别排序,从不同的角度审视性能消耗。

在xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,ubuntu可以通过apt安装
apt-get install graphviz

更好的注入方式

了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑

//开启xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//在程序结束后收集数据
register_shutdown_function(function() {
  $xhprof_data    = xhprof_disable();

  //让数据收集程序在后台运行
  if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
  }

  //保存xhprof数据
  ...
});

로그인 후 복사

但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件

vi /etc/php5/fpm/php.ini
로그인 후 복사

修改auto_prepend_file配置

auto_prepend_file = /opt/inject.php
로그인 후 복사

这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件

如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";
로그인 후 복사

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿