Verwenden Sie xhprof für die Online-PHP-Leistungsverfolgung und -Analyse
Freigeben: 2016-08-08 09:29:53
Original
1002 Leute haben es durchsucht
Ich habe Xdebug bereits für die PHP-Leistungsanalyse verwendet, was für lokale Entwicklungsumgebungen ausreichend ist. Wenn es sich jedoch um eine Online-Umgebung handelt, verbraucht xdebug viel Geld und die Konfiguration ist nicht flexibel genug um xhprof für Online-Umgebungen zu verwenden. Installation und einfache Verwendung von xhprofxhprof ist Facebooks leichtgewichtiges Open-Source-PHP-Leistungsanalysetool. Es kann direkt über pecl in einer Linux-Umgebung installiert werden, beispielsweise unter Ubuntu Nur 3 Zeilen der Anweisung pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart können verwendet werden, um zu überprüfen, ob die Erweiterung über phpinfo() geladen wurde. Wie verwende ich es konkret? Das xhprof-Projekt hat Beispiele und eine einfache Benutzeroberfläche bereitgestellt. Wenn Sie über http://localhost/xhprof/ auf das Projekt zugreifen können, können Sie die Ausgabe sehen 🎜> und Tipp: Überprüfen Sie die Ergebnisse unter http://localhost/xhprof/examples/sample.php. Besuchen Sie als Nächstes http:///index.php?run=XXX&source=xhprof_foo, um die gespeicherten Ergebnisse anzuzeigen und alle Funktionsaufrufe sowie die aufgewendete Zeit aufzulisten. http://localhost/xhprof/xhprof_html/Analysieren Sie den Beispielcode Der Schlüsselteil enthält nur 2 Zeilen: sample.php//开启xhprof并开始记录
xhprof_enable();
//运行一些函数
foo();
//停止记录并取到结果$xhprof_data = xhprof_disable();
zeichnet alle Funktionsaufrufzeiten und den CPU-Speicherverbrauch während des Einzelschritts auf Ausführung des Programms. Die spezifischen aufgezeichneten Indikatoren können über die Eingabeparameter von $xhprof_data gesteuert werden. Die anschließende Verarbeitung hat nichts mit der xhprof-Erweiterung zu tun, und die xhprof_enable wird serialisiert und in einem bestimmten Verzeichnis gespeichert. Wenn nicht angegeben, wird das Ergebnis in das aktuelle Verzeichnis ausgegeben wird nach XHProfRuns_Default ausgegeben. $xhprof_dataXHProfRuns_Default(__DIR__)xhprof.output_dir Organisieren und visualisieren Sie die aufgezeichneten Ergebnisse. Die Standard-UI-Listen: /tmpfunciton 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教程有兴趣的朋友有所帮助。
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31