Ò»¡¢Ç°ÑÔ
¡¡¡¡ÓÐÓõĶ«Î÷»¹ÊǼǼÏÂÀ´°É£¬Ò²*½±aÒÔºoµÄ²eѯ£»Õa´Î¼Ç¼һÏÂxhprofµÄ°²×°Ê¹Óã»
¡¡¡¡xhprofÊÇfacebook¿ªÔ´³oÀ´µÄÒ»¸ophpÇaÁ¿¼¶µÄÐÔÄÜ*ÖÎo¹¤¾ß£¬¸uXdebugÀaËÆ£¬µ«ÐÔÄÜ¿ªÏu¸uµÍ£¬
¡¡¡¡»¹¿ÉÒÔÓÃÔÚÉu²u»¾³ÖУ¬Ò²¿ÉÒÔÓɳÌÐo¿ª ¹ØÀ´¿ØÖÆÊÇñ½øÐÐprofile¡£
¶þ¡¢°²×°
wget http://pecl.php.net/get/xhprof-0.9.3.tgz
tar zxf xhprof-0.9.3.tgz
cd xhprof-0.9.3/extension
/usr/bin/phpize
(php°ae±¾°²×°ºoÉu³ÉµÄphpizeÎļþ£¬¿É¸u¾Ýphpinfo²e¿´£¬ËuÒÔphp°ae±¾²»Í¬£¬Éu³ÉµÄphpizeÒ²²»Í¬£¬´Ë²½ÖeÖ÷ÒªÉu³ÉconfigureÎļþ)
./configure ¨Cwith-php-config=/usr/bin/php-config
(php-configµÄÂ*¾¶£¬Ò²ÊÇphp°²×°ºoÉu³ÉµÄÎļþ)
make
sudo make install
(»a×Ô¶¯½«Éu³ÉµÄÀ(C)Õ¹Îļþ¿½±´µ½À(C)չĿ¼ÖÐ/usr/lib64/php/modules)
µ±È»¾ßÌaµÄphpÎļþµÄĿ¼£¬Ã¿¸oÈ˲»¾¡Ïaͬ£¬¿É¸u¾Ýphpinfo²eѯ
Èý¡¢php.iniÅaÖÃ
¸u¾ÝphpinfoÕÒµ½ extension_dirµÄĿ¼
£¨/etc/php.d/xhprof.ini£(C)
Ìi¼ÓÒ»ÏÂÄÚÈÝ£º
extension=xhprof.so
xhprof.output_dir=/tmp/xhprof //xhprofµÄ*ÖÎoÈÕÖ¾
*ËÄ¡¢ÖØÆoþÎñ**
sudo /etc/init.d/http restart
²e¿´phpinfoÊÇ*ñ°²×°³É¹¦
Îa¡¢Ê¹Óý¨
¿ªÍ*£º
xhprof_enable(); //¿ªÆo¼a²a
//xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); ²»¼Ç¼ÄÚÖõĺ¯Êý
//xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); ͬʱ*ÖÎoCPUºÍMemµÄ¿ªÏu
//Òª²aÊԵĴuÂe
...
...
...
½aβ£º
$xhprof_data = xhprof_disable(); //Í£Ö¹¼a²a£¬*µ»ØÔËÐÐÊý¾Ý
$xhprof_root = '/£¨xhprofµÄÐeÄaÖ÷»uĿ¼£(C)/';
//ÒýÈeµ±³o°²×°µ½xhprofÐeÄaÖ÷»uĿ¼ÖеÄÎļþ
include_once $xhprof_root."xhprof_lib/utils/xhprof_lib.php";
include_once $xhprof_root."xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof");
echo '<a href="http://£¨xhprofµÄÐeÄaÖ÷»uÓoÃu£(C)/xhprof_html/index.php?run='.$run_id.'&source;=xhprof" target="_blank">xhprofͳ¼Æ</a>';
¡¡¡¡ÉϱߵĴuÂeʹÓÃÁË£¬¸øxhprofÉeÖÃÐeÄaÖ÷»uµÄ½¨¡£
¡¡¡¡°ÑÔ´Âe°uÖÐµÄ xhprof_html ºÍ xhprof_lib Îļþ¼Ð¿½±´µ½×Ô¼º½¨Á¢µÄÐeÄaĿ¼ÖÐ
¡¡¡¡cp -r xhprof_html xhprof_lib /xxx/xhprof/ £¨´Ë´¦Ä¿µÄÊǽ¨Á¢Êý¾ÝÖÎoĿ¼£¬¿É½«´ËĿ¼ÅaÖóÉÐeÄaÖ÷»uÃÎÊ£(C)
¡¡¡¡ÔËÐкo£¬Í³¼Æµa»÷*µ»ØµÄ xhprofͳ¼Æ Á´½Ó£¬¼´¿É¡£
Áu¡¢×¢ÒaÎÊÌaÒÔ¼°Ãu´Ê½aÊÍ
¡¡¡¡ÔÚÏÔʾµÄͳ¼ÆÒ³ÃaeÖУ¬µa[View Full Callgraph]ͼÐλ¯ÏÔʾ£¨×i´oµÄÐÔÄÜÎÊÌa»aÓúiÉ«±e³o£¬Æa´ÎÊÇ»ÆÉ«£(C)£»
¡¡¡¡µa»÷ºo£¬¿ÉÄÜÌaʾ´iÎoÏuÏ¢£¬Ö´ÐÐÒÔÏÂÃuÁi¼´¿É
yum install -y graphviz
yum install graphviz-gd
¡¡¡¡Ãu´Ê½aÊÍ
Function Name º¯ÊýÃu
Calls µ÷ÓôÎÊý
Calls% µ÷ÓðÙ*Ö±È
Incl. Wall Time (microsec) µ÷ÓõİuÀ¨×Óº¯ÊýËuÓл¨*Ñʱ¼a ÒÔ΢ÃeËa(Ò»°ÙÍo*ÖÖ®Ò»Ãe)
IWall% µ÷ÓõİuÀ¨×Óº¯ÊýËuÓл¨*Ñʱ¼aµÄ°Ù*Ö±È
Excl. Wall Time (microsec) º¯ÊýÖ´Ðб¾Éi»¨*ѵÄʱ¼a£¬²»°uÀ¨×ÓÊ÷Ö´ÐÐʱ¼a,ÒÔ΢ÃeËa(Ò»°ÙÍo*ÖÖ®Ò»Ãe)
EWall% º¯ÊýÖ´Ðб¾Éi»¨*ѵÄʱ¼aµÄ°Ù*ֱȣ¬²»°uÀ¨×ÓÊ÷Ö´ÐÐʱ¼a
Incl. CPU(microsecs) µ÷ÓõİuÀ¨×Óº¯ÊýËuÓл¨*ѵÄcpuʱ¼a¡£¼oIncl. Wall Time¼´ÎªµÈ´ýcpuµÄʱ¼a
¼oExcl. Wall Time¼´ÎªµÈ´ýcpuµÄʱ¼a
ICpu% Incl. CPU(microsecs)µÄ°Ù*Ö±È
Excl. CPU(microsec) º¯ÊýÖ´Ðб¾Éi»¨*ѵÄcpuʱ¼a£¬²»°uÀ¨×ÓÊ÷Ö´ÐÐʱ¼a,ÒÔ΢ÃeËa(Ò»°ÙÍo*ÖÖ®Ò»Ãe)¡£
ECPU% Excl. CPU(microsec)µÄ°Ù*Ö±È
Incl.MemUse(bytes) °uÀ¨×Óº¯ÊýÖ´ÐÐʹÓõÄÄÚ´ae¡£
IMemUse% Incl.MemUse(bytes)µÄ°Ù*Ö±È
Excl.MemUse(bytes) º¯ÊýÖ´Ðб¾ÉiÄÚ´ae,ÒÔ×Ö½ÚËa
EMemUse% Excl.MemUse(bytes)µÄ°Ù*Ö±È
Incl.PeakMemUse(bytes) Incl.MemUseµÄ*aÖµ
IPeakMemUse% Incl.PeakMemUse(bytes) µÄ*aÖµ°Ù*Ö±È
Excl.PeakMemUse(bytes) Excl.MemUseµÄ*aÖµ
EPeakMemUse% EMemUse% *aÖµ°Ù*Ö±È
*xhprofµÄ°²×°Óe¼oÒ×Óè**
xhprofÊÇFacebook¿ªÔ´µÄÇaÁ¿¼¶PHPÐÔÄÜÖÎo¹¤¾ß£¬Linux»¾³Ï¿ÉÒÔͨ¹ýpeclÖ±½Ó°²×°£¬±ÈÈçÔÚUbuntuϽoÐe3ÐÐÖ¸Ái
pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart
Ö®ºo¿ÉÒÔͨ¹ýphpinfo()¼i²eÀ(C)Õ¹ÊÇ*ñÒѾ¼ÓÔØ¡£
¾ßÌaÈçºÎʹÓÃÄØ£¬xhprofÏiÄ¿ÖÐÒѾÌa¹(C)ÁËʾÀýÒÔ¼°¼oÒ×µÄUI£¬ÏÂÔØxhprofÏiÄ¿µ½webþÎñÆ÷£¬¼ÙÉe¿ÉÒÔͨ¹ýhttp://localhost/xhprof/ÃÎÊ£¬ÄÇôÃÎÊhttp://localhost/xhprof/examples/sample.php¿ÉÒÔ¿´µ½Ò»Ð(C)Êa³o£¬²¢ÇÒÌaʾͨ¹ýÃÎÊhttp://
ÖÎoÒ»ÏÂʾÀý´uÂesample.php£¬¹Ø¼u²¿ÖÖ»ÓÐ2ÐУº
//¿ªÆoxhprof²¢¿ªÊ¼¼Ç¼
xhprof_enable();
//ÔËÐÐÒ»Ð(C)º¯Êý
foo();
//Í£Ö¹¼Ç¼²¢È¡µ½½a¹u
$xhprof_data = xhprof_disable();
$xhprof_dataÖмǼÁ˳ÌÐoµ¥²½ÔËÐйý³ÌÖÐËuÓеĺ¯Êýµ÷ÓÃʱ¼a¼°CPUÄÚ´aeÏuºÄµÈ£¬¾ßÌa¼Ç¼ÄÄÐ(C)Ö¸±e¿ÉÒÔͨ¹ýxhprof_enableµÄÈe¿Ú²ÎÊý¿ØÖÆ£¬Ö®ºoµÄ´¦ÀiÒѾÓexhprofÀ(C)Õ¹Î޹أ¬´oÖÂÊDZaдÁËÒ»¸o´ae´¢ÀaXHProfRuns_Default£¬½«$xhprof_dataÐoÁл¯²¢±£´aeµ½Ä³¸oĿ¼£¬¿ÉÒÔͨ¹ýXHProfRuns_Default(DIR)½«½a¹uÊa³oµ½µ±Ç°Ä¿Â¼£¬Èç¹u²»Ö¸¶¨Ôo»a¶ÁÈ¡php.iniÅaÖÃÎļþÖеÄxhprof.output_dir£¬ÈÔȻûÓÐÖ¸¶¨Ôo»aÊa³oµ½/tmp¡£
xhprof_html/index.php½«¼Ç¼µÄ½a¹uÕuÀi²¢¿ÉÊÓ»¯£¬Ä¬ÈϵÄUIÀiÁгoÁË£º
•funciton name £º º¯ÊýÃu
•calls: µ÷ÓôÎÊý
•Incl. Wall Time (microsec)£º º¯ÊýÔËÐÐʱ¼a£¨°uÀ¨×Óº¯Êý£(C)
•IWall%£ºº¯ÊýÔËÐÐʱ¼a£¨°uÀ¨×Óº¯Êý£(C)Õ¼±È
•Excl. Wall Time(microsec)£ºº¯ÊýÔËÐÐʱ¼a£¨²»°uÀ¨×Óº¯Êý£(C)
•EWall%£ºº¯ÊýÔËÐÐʱ¼a£¨²»°uÀ¨×Óº¯Êý£(C)
ÿһÏiÓ¦¸Ã²»ÄÑÀi½a£¬ÒÔÏiÄ¿×Ô´øµÄsample.phpΪÀý£¬Ê¾ÀýÖбaдÁËÒ»¸omain()º¯Êý£¬main()º¯ÊýÖе÷ÓÃfoo()¡¢bar()µÈÒ»Ð(C)×Óº¯Êý½øÐÐÁËÒ»µa×Öu´¦Ài¡£Õu¸o³ÌÐoÔËÐйý³ÌÖУ¬main()º¯ÊýÖ»ÔËÐÐÁËÒ»´Î£¬²¢ÇÒÓÉÓÚmain()º¯ÊýÖаuÀ¨ÁËËuÓеÄÂß¼£¬ËuÒÔmain()º¯ÊýµÄIWall%Õ¼±ÈΪ100%£¬µ«ÊÇÓÉÓÚmain()º¯ÊýµÄ¹¦Äܶ¼ÊÇÓÉ×Óº¯ÊýʵÏֵģ¬Òo´Ëmain()º¯ÊýµÄEWall%Ö»ÓÐ0.3%£¬¶øfoo()º¯ÊýÍe³ÉÁËÖ÷ÒªµÄ¹¤×÷£¬EWall%ÓÐ98.1%¡£Òo´ËÔÚÖÎo¸u´oÐ͵ijÌÐoʱ£¬ÍuÍuÐeÒª¸u¾ÝÕa¼¸ÏiÖ¸±e*Ö±ðÅÅÐo£¬´Ó²»Í¬µÄ½Ç¶ÈÉoÊÓÐÔÄÜÏuºÄ¡£
ÔÚxhprof_html/index.phpÖл¹¿ÉÒÔ¿´µ½[View Full Callgraph]Á´½Ó£¬µa»÷ºo¿ÉÒÔ»aeÖƳoÒ»ÕÅ¿ÉÊÓ»¯µÄÐÔÄÜ*ÖÎoͼ£¬Èç¹uµa»÷ºo±¨´iµÄ»°£¬¿ÉÄÜÊÇȱÉÙÒÀÀµgraphviz£¬ubuntu¿ÉÒÔͨ¹ýapt°²×°
apt-get install graphviz
*¸uºÃµÄ×¢Èe½Ê½**
Á˽aÁËÉÏÃaeÕaÐ(C)£¬Æaʵ¾ÍÒѾ¿ÉÒÔ½«xhprofÕuºÏµ½ÈκÎÎÒÃÇÒÑÓеÄÏiÄ¿ÖÐÈ¥ÁË¡£Ä¿Ç°´o²¿*ÖMVC¿o¼Ü¶¼ÓÐΨһµÄÈe¿ÚÎļþ£¬Ö»ÐeÒªÔÚÈe¿ÚÎļþµÄ¿ªÊ¼´¦×¢ÈexhprofµÄÂß¼
//¿ªÆoxhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//ÔÚ³ÌÐo½aÊøºoÊÕ¼¯Êý¾Ý
register_shutdown_function(function() {
$xhprof_data = xhprof_disable();
//ÈÃÊý¾ÝÊÕ¼¯³ÌÐoÔÚºǫÔËÐÐ
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
//±£´aexhprofÊý¾Ý
...
});
µ«ÊÇÕaÑuÃa²»ÁËÒªÐÞ¸ÄÏiÄ¿µÄÔ´´uÂe£¬Æaʵphp±¾Éi¾ÍÌa¹(C)Á˸uºÃµÄ×¢Èe*½Ê½£¬±ÈÈ罫ÉÏÊoÂß¼±£´aeΪ/opt/inject.php£¬È»ºoÐÞ¸Äphp fpmÅaÖÃÎļþ
vi /etc/php5/fpm/php.ini
ÐÞ¸Äauto_prepend_fileÅaÖÃ
auto_prepend_file = /opt/inject.php
ÕaÑuËuÓеÄphp-fpmÇeÇoµÄphpÎļþÇ°¶¼»a×Ô¶¯×¢Èe/opt/inject.phpÎļþ
Èç¹uʹÓÃNginxµÄ»°£¬»¹¿ÉÒÔͨ¹ýNginxµÄÅaÖÃÎļþÉeÖã¬ÕaÑuÇÖÈeÐÔ¸uС£¬²¢ÇÒ¿ÉÒÔʵÏÖ»uÓÚÕ¾µaµÄ×¢Èe¡£
fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";