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

來源:互聯網
上載者:User

安裝xhprof擴充

wget http://pecl.php.net/get/xhprof-0.9.4.tgztar zxf xhprof-0.9.4.tgzcd xhprof-0.9.4/extension/sudo phpize./configuresudo makesudo make installcd ../

配置php.ini

[xhprof]extension=xhprof.soxhprof.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就可以看到效果了:


預設的UI裡列出了:

  • funciton name : 函數名

  • calls: 調用次數

  • Incl. Wall Time (microsec): 函數已耗用時間(包括子函數)

  • IWall%:函數已耗用時間(包括子函數)佔比

  • Excl. Wall Time(microsec):函數已耗用時間(不包括子函數)

  • EWall%:函數已耗用時間(不包括子函數)

在web中還可以看到 [View Full Callgraph] 連結,點擊後可以繪製出一張可視化的效能分析圖,如果點擊後報錯的話,可能是缺少依賴graphviz。graphviz是一個繪製圖形的工具,可以更為直觀的讓你查看效能的瓶頸。如果需要可以安裝:

yum install -y libpngyum install -y graphviz

效果:

非侵入式引入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('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();        $xhprof_runs->save_run($xhprof_data, 'xhprof');        }});

總結

本篇文章裡,我們介紹了如何基於xhprof擴充來分析PHP效能,並記錄到日誌裡,最後使用xhprof擴充內建的UI在web裡展示出來。主要知識點:

  • 安裝xhprof擴充

  • 在應用裡注入xhprof

  • 基於nginx展示分析結果

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.