>  기사  >  백엔드 개발  >  XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1

XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1

不言
不言원래의
2018-07-07 15:34:531358검색

xhprof 확장 설치

wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
sudo phpize
./configure
sudo make
sudo make install
cd ../

php.ini 구성

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp
참고: xhprof는 오랫동안 업데이트되지 않았습니다. php7은 https://github.com/phacility/를 사용할 수 있습니다. ...

xhprof 환경 구성

xhprof 압축 패키지의 두 디렉터리를 지정된 디렉터리에 복사해야 합니다(/work/xhprof/에 정의되어 있다고 가정): /work/xhprof/):

mkdir /work/xhprof/
cp -a xhprof_html/ /work/xhprof/
cp -a xhprof_lib/ /work/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();
    }
    include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
    include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');
});

代码解析:  
$xhprof_data中记录了程序运行过程中所有的函数调用时间及CPU内存消耗,具体记录哪些指标可以通过xhprof_enable的参数控制,目前支持的参数有:

  • HPROF_FLAGS_NO_BUILTINS 跳过所有内置(内部)函数。

  • XHPROF_FLAGS_CPU 输出的性能数据中添加 CPU 数据。

  • XHPROF_FLAGS_MEMORY 输出的性能数据中添加内存数据。

之后的处理已经与xhprof扩展无关,大致是编写一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp

xhprof_enablexhprof_disable是成对出现的,一个是代码运行最前面,一个是最后面。中间是要分析的代码。

经过上面的配置后,我们后续请求项目的接口,xhprof就会分析请求过程中的CPU、内存、耗时等内容。日志保存在xhprof.output_dir目录。

配置web

配置好了,怎么查看日志呢?我们可以搭建一个简单的web server:

xhprof.test.com.conf

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

    root /work/xhprof/xhprof_html;
    index  index.html index.php;


    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;
    }
}

然后配置虚拟主机xhprof.test.com。重启nginx,打开 xhprof.test.com就可以看到效果了:


XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1

默认的UI里列出了:

  • funciton name : 函数名

  • calls: 调用次数

  • Incl. Wall Time (microsec): 函数运行时间(包括子函数)

  • IWall%:函数运行时间(包括子函数)占比

  • Excl. Wall Time(microsec):函数运行时间(不包括子函数)

  • EWall%:函数运行时间(不包括子函数)

在web中还可以看到 [View Full Callgraph] 链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz。graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。如果需要可以安装:

yum install -y libpng
yum install -y graphviz

效果:
XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1

非侵入式引入xhprof

前面我们是通过在项目入口文件添加代码实现了分析的功能。更优雅的方式是新建一个额外的文件 xhprof.inc.php,保存在/work/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();
    }
    include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
    include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');
});
그런 다음 추가합니다. 프로젝트 프레임워크의 항목 파일에 추가:

auto_prepend_file = /work/xhprof/xhprof.inc.php
코드 분석:

$xhprof_data는 프로그램 실행 중 모든 함수 호출 시간과 CPU 메모리 소비를 기록합니다. 구체적으로 xhprof_enable 매개변수로 제어할 수 있는 지표입니다. 현재 지원되는 매개변수는 다음과 같습니다:


HPROF_FLAGS_NO_BUILTINS 모든 내장(내부) 함수를 건너뜁니다.

XHPROF_FLAGS_CPU로 출력되는 성능 데이터에 CPU 데이터를 추가합니다.

XHPROF_FLAGS_MEMORY는 성능 데이터 출력에 메모리 데이터를 추가합니다.

후속 처리는 xhprof 확장과 관련이 없습니다. 대략적으로 저장소 클래스 XHProfRuns_Default를 작성하고 $xhprof_data를 직렬화하여 특정 디렉터리에 저장합니다. 이는 XHProfRuns_Default(__DIR__)를 통해 수행할 수 있으며 지정되지 않은 경우 php.inixhprof.output_dir에 결과를 출력합니다. > 구성 파일을 읽습니다. 여전히 지정하지 않으면 출력이 /tmp로 전송됩니다.

xhprof_enablexhprof_disable은 쌍으로 나타나며, 하나는 실행 중인 코드의 앞에 있고 다른 하나는 끝에 있습니다. 가운데에는 분석할 코드가 있습니다.
  • 위 구성 후, 이후 프로젝트의 인터페이스를 요청하면 xhprof는 요청 프로세스 중 CPU, 메모리, 시간 소비 등을 분석합니다. 로그는 xhprof.output_dir 디렉터리에 저장됩니다.

    웹 구성
  • 웹 구성 후 로그는 어떻게 확인하나요? 간단한 웹 서버를 구축할 수 있습니다:

    xhprof.test.com.conf
location ~ \.php$ {
        
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "auto_prepend_file=/work/xhprof/xhprof.inc.php";
        include        fastcgi_params;
    }
  • 그런 다음 가상 호스트 xhprof.test.com을 구성합니다. nginx를 다시 시작하고 xhprof.test.com을 열어 효과를 확인하세요.

  • XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1

    기본 UI 목록:

    funciton 이름: 함수 이름

    🎜호출 횟수 🎜🎜🎜🎜 .벽 시간 (마이크로초): 기능 실행 시간(하위 기능 포함) 🎜🎜🎜🎜IWall%: 기능 실행 시간(하위 기능 포함) 비율 🎜🎜🎜🎜월 시간(마이크로초): 기능 실행 시간(하위 기능 제외) 기능)🎜🎜🎜🎜EWall%: 기능 실행 시간(하위 기능 제외)🎜🎜🎜🎜웹에서도 [전체 호출 그래프 보기] 링크를 보실 수 있으며, 클릭 후 시각적인 성능 분석 그래프를 그릴 수 있습니다. , 클릭 후 오류가 보고되면 종속성 graphviz가 누락되었을 수 있습니다. Graphviz는 성능 병목 현상을 보다 직관적으로 볼 수 있는 그래프 그리기 도구입니다. 필요한 경우 설치할 수 있습니다. 🎜
    <?php $profiling = !(mt_rand()%9); 
    if($profiling) xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
    register_shutdown_function(function() use($profiling) {
        if($profiling){
            $xhprof_data = xhprof_disable();
            if (function_exists(&#39;fastcgi_finish_request&#39;)){
                fastcgi_finish_request();
            }
            include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
            include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
            $xhprof_runs = new XHProfRuns_Default();
            $xhprof_runs->save_run($xhprof_data, 'xhprof');    
        }
    });
    🎜효과: 🎜XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1🎜🎜비침해적으로 xhprof 소개🎜🎜이전에는 프로젝트 항목 파일에 코드를 추가하여 분석 기능을 구현했습니다. 더 우아한 방법은 추가 파일 xhprof.inc.php를 만들어 /work/xhprof/ 디렉터리에 저장하는 것입니다. 🎜rrreee🎜코드를 실행하기 전에 PHP의 자동 로딩 기능을 사용하여 이 파일을 삽입하세요. , php.ini: 🎜rrreee🎜를 편집한 다음 PHP 서비스를 다시 시작하세요. 이는 이 PHP 환경을 사용하는 모든 사람에게 적용됩니다. 🎜🎜또는 지정된 프로젝트의 nginx 구성에 작성할 수 있습니다: 🎜jifen.cc.conf🎜rrreee🎜 그런 다음 nginx 서비스를 다시 시작하세요. 이는 이 프로젝트에만 적용됩니다. 🎜🎜auto_prepend_file 및 auto_append_file을 통해 포함된 파일은 이 모드에서 구문 분석되지만 함수를 호출하기 전에 정의해야 하는 등 몇 가지 제한 사항이 있습니다. 🎜🎜샘플링 빈도 수정🎜🎜기본적으로 xhprof는 매번 실행됩니다. 온라인 환경이 이와 같이 설정되면 성능에 영향을 미칩니다. 🎜🎜xhprof.inc.php🎜rrreee🎜Summary🎜🎜 이번 글에서는 xhprof 확장자를 기반으로 PHP 성능을 분석하여 로그에 기록하고, 마지막으로 xhprof 확장자가 제공하는 UI를 사용하여 표시하는 방법을 소개했습니다. 웹에서. 주요 지식 포인트: 🎜🎜🎜🎜xhprof 확장 설치🎜🎜🎜🎜애플리케이션에 xhprof 삽입🎜🎜🎜🎜nginx 기반 분석 결과 표시🎜🎜🎜🎜위 내용은 이 글의 전체 내용입니다. 모두의 학습에 도움이 됩니다. 더 많은 관련 콘텐츠를 보려면 PHP 중국어 웹사이트를 주목하세요! 🎜🎜관련 권장 사항: 🎜🎜🎜php7+의 php-fpm 매개변수 구성에 대한 참고 사항🎜🎜

    laravel-admin에서 양식을 편집할 때 현재 값을 자동으로 선택할 수 없는 문제 해결

    위 내용은 XHProf를 사용하여 PHP 성능 병목 현상을 분석하는 방법 1의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.