首頁  >  文章  >  後端開發  >  使用XHProf分析PHP性能瓶頸的方法一

使用XHProf分析PHP性能瓶頸的方法一

不言
不言原創
2018-07-07 15:34:531274瀏覽

安裝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,php7可以使用https://github. com/phacility/...。

設定xhprof環境

需要把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性能瓶頸的方法一

#預設的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性能瓶頸的方法一

非侵入式引入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');
});
利用PHP的自動載入功能,在執行程式碼前注入此文件,編輯php.ini:

auto_prepend_file = /work/xhprof/xhprof.inc.php
然後重啟PHP服務。這樣所有使用該php環境的都會生效。

或寫到指定項目的nginx配置裡也行:

jifen.cc.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;
    }
然後重啟nginx服務。這樣僅該項目生效。

透過 auto_prepend_file 和 auto_append_file所包含的檔案在此模式下會被解析,但有些限制,例如函數必須在被呼叫之前定義。
修改取樣頻率

預設情況下,xhprof每次都會運行,線上環境如果這麼設置,會對效能有影響。

xhprof.inc.php

<?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效能,並記錄到日誌裡,最後使用xhprof擴充自備的UI在web裡展示出來。主要知識點:

  • 安裝xhprof擴充功能

  • 在應用程式中註入xhprof

  • 基於nginx展示分析結果

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

php7 的php-fpm參數配置的注意事項

解決laravel-admin中select在form編輯時不能自動選取目前的值的問題

以上是使用XHProf分析PHP性能瓶頸的方法一的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn