下載源碼包的網址
http://pecl.php.net/package/xhprofphp
上面說了,每一個版本適用的php版本。html
規劃(預先搞清楚思路)
1、這是一個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:我也在思考,這個東西怎麼這麼容易忘記。我只知道他的做用。可是徹底不記得他的操做步驟。要注意的細節。
看我得想辦法以通俗的方式來理解記住它。
2、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
3、有了這個擴展後,就能在本身的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");
=====================================================mysql
幾個擴展函數以下linux
步驟實施
一、先找到我服務器上php的安裝目錄,phpize通常都是在安裝目錄中,以下:
/usr/local/php/bin/phpize
二、找出php-config在哪一個目錄(下面會用到),個人服務器在:
/usr/local/php/bin/php-config
目的:在下面進行編譯的時候,會用到這個文件
./configure --with-php-config=/usr/local/php/bin/php-config
三、找到我服務器上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),解壓後的目錄結構以下web
cd xhprof-0.9.3/extension/ #切換到這個擴展的源碼目錄去
sql
在這個目錄下面運行phpize,就會在extension目錄下生成一個configure文件(這是phpize的機制)shell
/usr/local/php/bin/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
oracle
剛纔生成了xhprof.so這個模塊文件,如今要在php.ini中加載剛纔生成xhprof.so模塊才能生效:
[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.output_dir=/tmp/xhprof
平滑從新加載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);
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
$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++){
}
}
$data = xhprof_disable();
include_once "xhprof_lib/utils/xhprof_lib.php";//從源碼包中拷貝xhprof_lib這個文件夾過來直接能夠調用
include_once "xhprof_lib/utils/xhprof_runs.php";
$objXhprofRun = new XHProfRuns_Default();//數據會保存在php.ini中xhprof.output_dir設置的目錄去中
$run_id = $objXhprofRun->save_run($data, "test");
//第二個參數是定義文件名稱。名稱若是爲"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表示函數自己的執行時間。這個時間並不包含裏面調用其餘函數的耗時(其實就是去掉裏面其餘函數的耗時,由於函數裏面調用到的函數也會進行單獨統計)。
而Inclusive Time則是包括了裏面調用的子函數時間(descendant functions)
因此,個人理解是Exclusive Time<=Inclusive Time