>  기사  >  백엔드 개발  >  온라인 PHP 성능 추적 및 분석을 위해 xhprof 사용

온라인 PHP 성능 추적 및 분석을 위해 xhprof 사용

WBOY
WBOY원래의
2016-08-08 09:29:53997검색
이전부터 PHP 성능 분석을 위해 Xdebug를 사용해 본 적이 있는데, 로컬 개발 환경에서는 충분하지만, 온라인 환경이라면 xdebug는 많은 비용을 소모하고 구성이 유연하지 않기 때문에 추천합니다. 온라인 환경에 xhprof를 사용하려면 PHP 성능 추적 및 분석을 수행하세요. xhprof 설치 및 간단한 사용법xhprof는 Facebook의 경량 오픈소스 PHP 성능 분석 도구로 Ubuntu 등 Linux 환경에서 pecl을 통해 직접 설치할 수 있습니다. 확장 프로그램이 을 통해 로드되었는지 확인하려면 pecl install xhprof-beta echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini service php5-fpm restartphpinfo() 3줄의 명령만 사용할 수 있습니다. 구체적으로 사용하는 방법은? xhprof 프로젝트에서 예제와 간단한 UI를 제공합니다. xhprof 프로젝트를 웹 서버에 다운로드하면 http://localhost/xhprof/에 액세스하여 일부 출력을 볼 수 있습니다. 🎜> 및 팁: http://localhost/xhprof/examples/sample.php을 방문하여 결과를 확인하세요. 다음으로 http:///index.php?run=XXX&source=xhprof_foo을 방문하여 모든 함수 호출과 소요 시간이 나열된 저장된 결과를 확인하세요. http://localhost/xhprof/xhprof_html/샘플 코드를 분석합니다. 핵심 부분에는 단 2줄만 있습니다. sample.php//开启xhprof并开始记录 xhprof_enable(); //运行一些函数 foo(); //停止记录并取到结果$xhprof_data = xhprof_disable(); 은 단일 단계 동안 모든 함수 호출 시간과 CPU 메모리 소비를 기록합니다. 프로그램 실행 중, 기록된 특정 표시는 $xhprof_data의 입력 매개변수를 통해 제어할 수 있습니다. 후속 처리는 기본적으로 저장 클래스 xhprof_enable가 작성되고 XHProfRuns_Default는 직렬화되어 특정 디렉터리에 저장됩니다. $xhprof_data을 통해 결과를 현재 디렉터리로 출력할 수 있습니다. 지정하지 않은 경우 php.ini 구성 파일의 XHProfRuns_Default(__DIR__)을 읽습니다. 결과는 xhprof.output_dir에 출력됩니다. /tmp 기록된 결과를 정리하고 시각화합니다. 기본 UI 목록은 다음과 같습니다. xhprof_html/index.php
  • funciton name : 函数名
  • calls: 调用次数
  • Incl. Wall Time (microsec): 函数运行时间(包括子函数)
  • IWall%:函数运行时间(包括子函数)占比
  • Excl. Wall Time(microsec):函数运行时间(不包括子函数)
  • EWall%:函数运行时间(不包括子函数)
  • 每一项应该不难理解,以项目自带的sample.php为例,示例中编写了一个main()函数,main()函数中调用foo()、bar()等一些子函数进行了一点字符处理。整个程序运行过程中,main()函数只运行了一次,并且由于main()函数中包括了所有的逻辑,所以main()函数的IWall%占比为100%,但是由于main()函数的功能都是由子函数实现的,因此main()函数的EWall%只有0.3%,而foo()函数完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序时,往往需要根据这几项指标分别排序,从不同的角度审视性能消耗。xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,ubuntu可以通过apt安装apt-get install graphviz 更好的注入方式了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑//开启xhprof xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU); //在程序结束后收集数据 register_shutdown_function(function() { $xhprof_data = xhprof_disable(); //让数据收集程序在后台运行if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } //保存xhprof数据 ... }); 但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件vi /etc/php5/fpm/php.ini 修改auto_prepend_file配置auto_prepend_file = /opt/inject.php这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php"; 更好的分析工具:xhprof.io还是xhpgui注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,听起来似乎又是一大堆工作,有现成的轮子可以用吗?经过搜索和比较,貌似比较好的选择有xhprof.io以及xhpgui。两个项目做得事情差不多,都提供了xhprof数据保存功能以及一套索引展示数据的UI,下面是一些比较xhprof.io
  • ? 年久失修
  • ? 保存xhprof数据到MySQL
  • ? 支持域名、URI等多个维度的数据索引
  • ? 函数调用记录完整,内核级别函数都能显示
  • ? 无法针对个别URI开启
  • ? 注入被分割成两个文件,如果程序被强制中断时xhprof数据将无法收集
  • xhgui
  • ? 保存xhprof数据到MongoDB
  • ? 不支持域名索引
  • ? 函数调用记录不完整,部分内核级别函数(如扩展内)无法显示
  • ? 有配置文件可以控制开启条件
  • ? 注入只有一个文件
  • ? 狂拽酷炫的基于D3.js的调用关系动态图
  • 可以看到其实两个项目都不够完善,相对而言xhgui不支持域名索引对于线上调试来说是无法忍受的,因此我最后的选择是使用xhprof.io,但是自己进行了微量的调整,修改后的xhprof.io修正版支持:
  • ? 增加开启开关配置,可以针对个别URI开启
  • ? 注入文件合并为一个
  • xhprof.io修正版安装与使用安装及配置方法如下,假设web服务器根目录为/opt/htdocscd /opt/htdocs git clone https://github.com/EvaEngine/xhprof.io.git cd xhprof.io/ composer install cp xhprof/includes/config.inc.sample.php xhprof/includes/config.inc.php vi xhprof/includes/config.inc.php 在MySQL中建立xhprof.io数据库,假设数据库名为xhprof,然后导入xhprof/setup/database.sql配置文件config.inc.php中需要调整
  • 'url_base' => 'http://localhost/xhprof.io/', 这是xhprof.io界面所在路径
  • 'pdo' => new PDO('mysql:dbname=xhprof;host=localhost;charset=utf8', 'root', 'password'), 根据MySQL实际情况调整配置
  • enable 这是一个匿名函数,当匿名函数返回true时启用xhprof数据收集
  • 通过配置enable项,就可以实现线上调试的需求,比如始终开启xhprof'enable' => function() { returntrue; } 1/100概率随机开启xhprof'enable' => function() { return rand(0, 100) === 1; } 网页携带参数debug=1时开启xhprof'enable' => function() { return !empty($_GET['debug']); } 网页URL为特定路径时开启'enable' => function() { return strpos($_SERVER['REQUEST_URI'], '/testurl') === 0; } 最后按上文所述,在要配置的项目中包含xhprof.io/inc/inject.php即可。线上环境操作时务必要胆大心细,如果没有结果尤其注意需要检查xhprof扩展是否安装。附录:xhpgui的安装方法apt-get install mongodb php5-mongo php5-mcrypt cp /etc/php5/mods-available/mcrypt.ini /etc/php5/fpm/conf.d/ cp /etc/php5/mods-available/mcrypt.ini /etc/php5/cli/conf.d/ cd /opt/htdocs git clone https://github.com/perftools/xhgui.git cd xhgui composer install cp config/config.default.php config/config.php chown www-data.www-data -R cache 编辑Nginx配置文件加入fastcgi_param PHP_VALUE "auto_prepend_file=/opt/htdocs/xhgui/external/header.php"; 收集数据过多时可以清空mongodbmongo use xhprof; db.dropDatabase();

    以上就介绍了使用xhprof进行线上PHP性能追踪及分析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.