使用XHProf进行线上PHP性能追踪及分析

sunshiming 8年前
   <p>今天介绍下大家并不陌生的XHProf。它是非死book开发的用来分析线上PHP性能的工具。相比较于Xdebug,占用内存和性能更低。</p>    <h2>1.XHProf安装</h2>    <pre>  <code class="language-php"># wget http://pecl.php.net/get/xhprof-0.9.4.tgz  # tar zxvf xhprof-0.9.4.tgz  # cd xhprof-0.9.4/extension/  # phpize //结合自己的环境确认phpize的目录  # ./configure --with-php-config=/usr/local/php/bin/php-config //结合自己的环境确认phpize的目录  # make  # make install</code></pre>    <p>安装完成后,在php.ini中添加 extension=xhprof.so。</p>    <p>重启下web应用服务器。</p>    <h2>2.监控配置</h2>    <p>PHP5.5以下,PHP文件中开启的代码</p>    <pre>  <code class="language-php">xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);</code></pre>    <p>PHP5.5及以上,PHP文件中开启的代码</p>    <pre>  <code class="language-php">xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);</code></pre>    <p>简单的方式网上都可以百度到,下面主要讲下更好的注入方式。使用PHP本身进行注入,这样就不用修改PHP的项目代码。</p>    <p>具体的注入方式为:修改php.ini的文件,加上 auto_prepend_file =  /opt/inject_xhprof.php,这样所有的php-fpm请求的php文件前都会自动注入/opt/inject_xhprof.php文件。inject_xhprof.php代码如下:</p>    <pre>  <code class="language-php">if(php_sapi_name() == 'cli')  {  return;  }    $xhprof_config = require "/opt/xhprof_config.php";    if(!empty($xhprof_config['enabled']) && strpos($xhprof_config['allowUrl'],$_SERVER['SERVER_NAME']) !== false)  {  xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);    register_shutdown_function('shutdown');    }    function shutdown()  {  $xhprof_data = xhprof_disable();  include_once "/wwwroot/tools/xhprof/xhprof_lib/utils/xhprof_lib.php";  include_once "/wwwroot/tools/xhprof/xhprof_lib/utils/xhprof_runs.php";    $objXhprofRun = new XHProfRuns_Default();  $run_id = $objXhprofRun->save_run($xhprof_data, "xhprof");  //此处空间很大  if(function_exists('fastcgi_finish_request'))  {  fastcgi_finish_request();  }  }</code></pre>    <p>以上的代码是基于LNMP,其中PHP5.2.17 、MySQL5.6 、Nginx1.4进行测试的。以上的方法就不用在PHP的代码中加上开始和结束的XHProf的代码了。</p>    <p>其中xhprof_config.php可以配置是否开启调试、哪些网站允许调试、哪些IP允许执行XHProf等操作。</p>    <p>此处空间很大。具体可以做的事情为: 将生产的$run_id异步存入数据库或者Redis,这样就可以方便的进行两次优化的性能对比,输入网址,直接查看当前地址的性能。</p>    <h2>3.WEB查看</h2>    <p>将xhprof_html拷贝到单独的目录下,配置独立的域名,这样可以更方便的管理。</p>    <h2>4.总结</h2>    <p>XHProf追踪和分析PHP性能的确不错。但是为了不影响线上的性能,最好放在灰度环境进行测试。如果放在线上测试的话,建议做一个随机值,比如没1000次进行一次分析。</p>    <p>将$run_id异步存入数据库或者Redis也是为了更好地分析。</p>    <p>以前在只开启xhprof_enable的时候,没有关闭操作,导致页面加载很慢,具体的原因没有找到,所以大家在做判断的时候,最好xhprof_enable 和 xhprof_disable 一起判断。</p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959674728925256444" rel="nofollow">http://blog.mofeiwo.com/xhprof_php/</a></p>    <p> </p>