天天看點

facebook工具xhprof的安裝與使用-分析php執行性能

下載下傳源碼包的網址

http://pecl.php.net/package/xhprof

上面說了,每個版本适用的php版本。

規劃(預先搞清楚思路)

一、這是一個php擴充的形式。我們安裝gd2,curl都是php的擴充形式。隻不過有的時候編譯的時候就安裝進去了。

像操作mysql資料庫,也是一個mysql.so這樣的擴充,安裝了擴充,就能調用mysql_query()這些函數。

要操作oracle資料庫,也有對應的oracle擴充加到php引擎中去。

現在要把xhprof擴充加到php中去。

很久沒使用phpize安裝擴充了。我自己忘得差不多了。于是重新去自己的部落格找到以前寫的文章複習一下。

http://www.cnblogs.com/wangtao_20/archive/2011/03/16/1986508.html

ps:我也在思考,這個東西怎麼這麼容易忘記。我隻知道他的作用。但是完全不記得他的操作步驟。要注意的細節。

看我得想辦法以通俗的方式來了解記住它。

二、php.ini需要進行配置的項

[xhprof]

extension=xhprof.so;

; directory used by default implementation of the iXHProfRuns

; interface (namely, the XHProfRuns_Default class) for storing

; XHProf runs.

;

;xhprof.output_dir=<directory_for_storing_xhprof_runs>

;儲存 XHProf 運作資料的預設目錄

xhprof.output_dir=/tmp/xhprof

三、有了這個擴充後,就能在自己的php代碼中調用這個擴充内置的函數來做性能監控了,像下面這樣子

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

................這裡是要被監控的代碼塊

$data = xhprof_disable();

include_once "xhprof_lib/utils/xhprof_lib.php";  

include_once "xhprof_lib/utils/xhprof_runs.php";  

$objXhprofRun = new XHProfRuns_Default();//資料會儲存在php.ini中xhprof.output_dir設定的目錄去中

$run_id = $objXhprofRun->save_run($data, "test");

=====================================================

幾個擴充函數如下

步驟實施

1、先找到我伺服器上php的安裝目錄,phpize一般都是在安裝目錄中,如下:

/usr/local/php/bin/phpize

2、找出php-config在哪個目錄(下面會用到),我的伺服器在:

/usr/local/php/bin/php-config

目的:在下面進行編譯的時候,會用到這個檔案

./configure --with-php-config=/usr/local/php/bin/php-config

3、找到我伺服器上php擴充在哪個目錄,不确定的話,我覺得去php.ini中也能看到,如下

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/" 這個路徑感覺有點長。不用去改了php.ini中的設定,目前我覺得沒必要(商業與時間成本,這部分還不是制約因素)。按原來的繼續放擴充。

現在知道擴充目錄為:/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

也就是說,我要把xhprof的源碼包解壓到這個目錄下去(解壓後會生成一個新的檔案夾)。

那我就要去這個目錄下運作phpize(這樣友善在這個目錄下面生成configure檔案),

phpize的特點:在a目錄下運作phpize,就會在a目錄下生成configure。

得到上面路徑,shell指令實踐

cd  /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

解壓下載下傳到的xhprof壓縮包(我不是通過wget下載下傳的,我是把這個壓縮直接通過ftp上傳到no-debug-non-zts-20060613目錄中去)。

tar zxf xhprof-0.9.3.tgz               #解壓後,裡面有個extension檔案夾,進入裡面去(目的是進入裡面去運作phpize),解壓後的目錄結構如下

cd xhprof-0.9.3/extension/            #切換到這個擴充的源碼目錄去

在這個目錄下面運作phpize,就會在extension目錄下生成一個configure檔案(這是phpize的機制)

去看一下擴充目錄,會發現在extension目錄生成了一個configure檔案。運作它

======================================

./configure --with-php-config=/usr/local/php/bin/php-config #用到了前面找到的php-config檔案。

make && make install

make test

運作成功後,會提示生成的xhprof.so檔案在哪個位置,提示資訊:

Libraries have been installed in:

   /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof-0.9.3/extension/modules

這個目錄下已經存在一個檔案:

/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xhprof.so

剛才生成了xhprof.so這個子產品檔案,現在要在php.ini中加載剛才生成xhprof.so子產品才能生效:

平滑重新加載php.ini檔案:/usr/local/php/sbin/php-fpm reload

提示:

Reload service php-fpm  done

說明成功。

現在去phpinfo中看xhprof擴充是否加載成功了

安裝作圖工具(選填,可以後續再安裝)

yum install -y graphviz

================================================

工具的使用實踐

index.php中的代碼:

<?php

error_reporting(-1);

$begin_time = microtime_float();

///////////////統計執行速度代碼

$end_time = microtime_float();

$exec_time  = $end_time-$begin_time;

//@save_stat($exec_time);

for($i=0;$i<10;$i++){

for($j=0;$j<10;$j++){

}

include_once "xhprof_lib/utils/xhprof_lib.php";//從源碼包中拷貝xhprof_lib這個檔案夾過來直接可以調用

//第二個參數是定義檔案名稱。名稱如果為"xhprof",則在xhprof.output_dir設定的目錄生成的檔案:522ab85f40229.xhprof.xhprof。

//格式為:"id辨別.組名稱.xhprof",id辨別就是$run_id得到的結果。

//id辨別是每次運作的時候就生成一個新的辨別,也就是生成一個新的檔案,記錄每次運作的資料

var_dump($run_id);

echo "http://www.xxxx.com/xhprof_html/index.php?run={$run_id}&source=test\n";//source的值必須是save_run中指定的名稱。這個其實就是根據編号和名稱才能定位到對應的檔案"522ab85f40229.xhprof.xhprof"

//将這個位址輸出來,是為了直接可以去檢視分析結果。

function save_stat($time)

{

    static $call_count=1;

    $call_limit = 10;

    if(!$time) return ;

        $date = date("Y-m-d");//暫時按照天來生成檔案。友善查閱

    $exec_stat_file = './exec_stat'.DIRECTORY_SEPARATOR."exec_stat_file-".$date.".txt";

    $fp = fopen($exec_stat_file,'ab');

    if(flock($fp,LOCK_EX))

    {

        $s = 'access:'.date("Y-m-d H:i:s").',execute time:'.$time.'s,request_url:http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."||".PHP_EOL;

        fwrite($fp,$s);

        flock($fp,LOCK_UN);

    }else{

        usleep(1000);

        if($call_count<$call_limit)

        {

            $call_count++;

            save_stat($time);

        }

    }

    @fcolse($fp);

    //var_dump($fp);

function microtime_float()

    list($usec, $sec) = explode(" ", microtime());

    return ((float)$usec + (float)$sec);

?>

加粗的黑體,就是分析用到的代碼。

其中用到了源碼包中的xhprof_lib中的代碼,代碼中"XHProfRuns_Default"這個類就是裡面的。

生成了分析結果後,現在可以去使用源碼包中提供的web版的工具檢視了。

xhprof_html這個檔案夾随便放到哪裡,隻要放到能夠通過web通路的目錄下即可,不過這個裡面會用到xhprof_lib中的類,是以還是一起複制過去,跟源碼包中保持一樣的結構才好。xhprof_html與xhprof_lib要保持平行

我這裡,這個工具的通路方式是:http://www.xxxx.com/xhprof_html/index.php?run=xxx&source=xxx\n

source的值必須是save_run中指定的名稱。這個其實就是根據編号和名稱才能定位到對應的檔案"522ab85f40229.xhprof.xhprof"

通路看到的結果如下

圖中,紅色的表示最耗費性能的,黃色的其次。

隻了解這麼多了。具體的分析結果怎麼看,在檔案夾xhprof_html中有個docs目錄,裡面是說明文檔。說了一些專用術語的定義

注意點:在php.ini中xhprof.output_dir設定的目錄,要自己手動去建立。這個工具不會自動去建立。沒有該檔案夾。就不會生成。另外,在linux下還要保證權限設定好,我設定的屬主是www就可以用了。

 機關:1s(秒)=1000ms(毫秒)

 官方解釋

Exclusive Time/Self Time: Measures time spent in the function itself. Does not include time in descendant functions.

Wall Time: a.k.a. Elapsed time or wall clock time.

CPU Time: CPU time in user space + CPU time in kernel space

Exclusive Time表示函數本身的執行時間。這個時間并不包含裡面調用其他函數的耗時(其實就是去掉裡面其他函數的耗時,因為函數裡面調用到的函數也會進行單獨統計)。

而Inclusive Time則是包括了裡面調用的子函數時間(descendant functions)

是以,我的了解是Exclusive Time<=Inclusive Time