採用xhprof擴展對PHP項目進行性能分析

背景

  由於我們的項目是另外一個團隊的server端,給他們提供的2個接口他們偶爾反應程序調用超時,他們設置httpClient的超時時間爲10s。一般情況下來說我們程序一定要保證在5s以內就要返回response給客戶端了,所以我們想分析一下我們的程序到底是哪個模塊或者函數調用上耗時嚴重. 一般我們最容易想到的方法就是在某個方法前拿到開始時間戳,然後在方法執行完以後得出結束時間戳,減去開始時間戳,得到方法運行的時間。這種"土辦法",我只能說你自己寫幾個小demo或者代碼量很小的時候,確實能最快定位到問題所在.但是龐大的項目,成百個函數,方法調用錯綜複雜,你還這麼查? 那恭喜你,上班不用幹別的事情了,你就做這個無聊且無意義的事情吧.最主要是最後統計結果不一定準,所以用"土辦法"針對大型項目是行不通的. 自然我們想到了是不是存在某種針對PHP程序函數調用鏈追蹤的工具來幫助我們分析,能夠很直觀地查看到函數的調用鏈並且能夠查看每個函數的耗時時間或者內存,cpu等情況呢?

解決方案

  Google一下還真讓我找到了一個名爲 xhprof的PHP擴展工具,據說是Facebook開源的.大樹下面好乘涼,既然Facebook出品那應該還可以.xhprof擴展能讓我們實現查看程序開始到結束的函數調用鏈分析,例如耗時,內存,cpu等等很清晰的展現在我們面前,這樣有利於我們對程序性能調優.

1.文檔信息和PECL

  xhprof文檔地址
  PECL地址

2.Github地址

  github

簡單使用

  一般在框架index.php入口文件開頭開啓追蹤

<?php

xhprof_enable();


  在http響應給客戶端之前,一般在框架的output之前統一出口加上結束追蹤代碼即可

<?php

// include file  具體路徑根據自己項目決定
$XHPROF_ROOT = APPPATH . '../webroot';
@include_once $XHPROF_ROOT . "/xhprof/xhprof_lib/utils/xhprof_lib.php";
@include_once $XHPROF_ROOT . "/xhprof/xhprof_lib/utils/xhprof_runs.php";

// 判斷要調用的class和函數是否都存在 存在才調用
if (class_exists('XHProfRuns_Default') && function_exists('xhprof_disable')) {
    $xhprof_runs = new XHProfRuns_Default();
    $xhprof_data = xhprof_disable();
    $traceId = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
    if (is_array($response)) {
        $response['trace_id'] = $traceId; // 把trace_id記錄下來 等會到部署的前端html頁面輸出參數即可查看這個trace的調用鏈信息
    }
}

界面展示

  把xhprof在github項目當做submoodule或者git clone到你的webroot下面,能否就行.html入口目錄是xhprof項目的xhprof_html下.把上面記錄的trace_id替換一個地址例如: http://127.0.0.1:8090/xhprof/xhprof_html/?run={$traceId}&source=xhprof_foo&all=1
訪問即可看到界面如下:

image

  參數含義參考:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章