介绍
在软件工程中,配置文件是一种用于在运行时分析应用程序的技术,以便在应用程序中识别可能的瓶颈和性能问题. 它是软件优化的一个必不可少的资源。
一个 profiler是一个软件,将收集有关应用程序的详细信息,以生成统计数据和关于内存使用,函数呼叫的频率和持续时间,响应请求的时间等等。
XHProf 是旨在分析 PHP 应用程序的配置文件,由 Facebook 创建并开源,XHProf 作为被动配置文件,这意味着它将在背景中工作,同时对应用程序的性能产生最小影响,使其适合用于生产环境。
XHGui提供了一个丰富的界面来可视化通过XHProf收集的数据。
本教程将向您展示如何安装XHProf和XHGui来配置运行在Ubuntu 14.04上的PHP应用程序。
<$>[注] XHProf目前不支持PHP 7. 如果您正在使用PHP 7在您的服务器上,您可以尝试代替tideways/php-profiler-extension,它作为XHProf的插入替代品。
前提条件
为了遵循这个指南,你将需要:
- 具有非 root sudo 用户的 Ubuntu 14.04 服务器,您可以通过遵循我们的 初始服务器设置指南
- 运行 PHP 应用程序的功能性 PHP 网络服务器环境,将被分析
当你准备好继续时,使用你的 sudo 帐户登录你的服务器
步骤 1 - 安装服务器依赖
如果你没有在你的服务器上安装 pecl
,你应该现在安装它。
首先,更新包管理器缓存:
1sudo apt-get update
我们还需要php5-dev
来通过pecl
安装PHP模块,以及php5-mcrypt
来设置XHGui:
1sudo apt-get install php-pear php5-dev php5-mcrypt
要启用mcrypt
扩展,运行:
1sudo php5enmod mcrypt
最后,我们需要 Git 来安装 XHGui. 如果 Git 尚未安装在您的服务器上,您现在可以通过:
1sudo apt-get install git
步骤2 — 安装 XHProf
现在我们应该安装和启用 XHProf。 要通过 pecl
安装它,运行:
1sudo pecl install xhprof-beta
接下来,我们需要激活xhprof
扩展. 为了方便这个过程,同时保持Ubuntu/Debian标准,我们将创建一个单独的ini
配置文件,并使用命令php5enmod
启用它。
在/etc/php5/mods-available
中创建一个新的ini
配置文件:
1sudo nano /etc/php5/mods-available/xhprof.ini
在此文件中包含以下内容:
1[label /etc/php5/mods-available/xhprof.ini]
2extension=xhprof.so
要启用模块配置文件,运行:
1sudo php5enmod xhprof
现在剩下的唯一事情是重新启动 Web 服务器,以便应用更改. 在 LAMP 环境(Apache)中,您可以通过:
1sudo service apache2 restart
在 LEMP环境(Nginx + PHP5-FPM)中,您应该使用以下方式重新启动php5-fpm
服务:
1sudo service php5-fpm restart
现在应该安装和激活xhprof
扩展. 要确认,您可以运行:
1php --ri xhprof
结果应该是这样的:
1[secondary_label Output]
2xhprof
3
4xhprof => 0.9.2
5CPU num => 1
步骤3 — 安装 MongoDB
下一步是将MongoDB和mongo
PHP扩展安装在服务器上。
要安装 MongoDB,请运行:
1sudo apt-get install mongodb
要安装 MongoDB PHP 扩展,请运行:
1sudo pecl install mongo
安装程序会要求您在某个时刻输入,以选择是否要为 MongoDB 启用企业身份验证。
现在我们需要激活mongo
PHP扩展,按照我们使用的xhprof
扩展的相同程序创建一个新的配置文件在/etc/php5/mods-available/mongo.ini
:
1sudo nano /etc/php5/mods-available/mongo.ini
将下列内容纳入文件中:
1[label /etc/php5/mods-available/mongo.ini]
2extension=mongo.so
要启用模块配置文件,运行:
1sudo php5enmod mongo
现在重新启动 Web 服务器以应用更改. 在 LAMP 环境(Apache)中,您可以通过:
1sudo service apache2 restart
在 LEMP环境(Nginx + PHP5-FPM)中,您应该使用以下方式重新启动php5-fpm
服务:
1sudo service php5-fpm restart
现在应该安装和激活mongo
扩展. 要确认,您可以运行:
1php --ri mongo
结果应该是这样的:
1[secondary_label Output]
2mongo
3
4MongoDB Support => enabled
5Version => 1.6.12
6Streams Support => enabled
7SSL Support => enabled
8 Supported Authentication Mechanisms
9MONGODB-CR => enabled
10SCRAM-SHA-1 => enabled
11MONGODB-X509 => enabled
12GSSAPI (Kerberos) => disabled
13PLAIN => disabled
14...
步骤 4 — 设置 MongoDB 索引(可选)
这是一个可选但推荐的步骤,可在存储和访问 MongoDB 数据时改善 XHGui 的整体性能。
通过命令行访问 MongoDB 客户端:
1mongo
现在,运行以下命令序列来创建 XHGui 的索引:
1use xhprof
2db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
3db.results.ensureIndex( { 'profile.main().wt' : -1 } )
4db.results.ensureIndex( { 'profile.main().mu' : -1 } )
5db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
6db.results.ensureIndex( { 'meta.url' : 1 } )
要退出 MongoDB 客户端,请运行:
1exit
步骤5 — 安装XHGui
下一步是安装XHGui并将其设置为虚拟主机在您的Web服务器上。
由于我们需要将XHGui的内容作为Web服务器上的虚拟主机,我们将将克隆的存储库放置在/var/www
内部。
建议您将 XHGui 目录设置为常用用户的所有权. 在本示例中,我们将使用sammy
作为用户名和组,但您应该用自己的用户名和组来代替这些值。
1sudo mkdir -p /var/www/xhgui
2sudo chown -R sammy.sammy /var/www/xhgui
3cd /var/www
4git clone https://github.com/perftools/xhgui.git xhgui
要安装 XHGui 的依赖,请运行包含的安装程序:
1cd xhgui
2php install.php
依赖性成功安装后,我们需要配置一个虚拟主机来服务xhgui
的内容。下一个部分涵盖如何在LAMP和LEMP环境中创建xhgui
的虚拟主机。
在 LAMP 上设置 XHGui 的虚拟主机
当使用Apache作为Web服务器时,我们首先需要确保mod_rewrite
已启用。
1sudo a2enmod rewrite
创建一个新的虚拟主机文件在 /etc/apache2/sites-available
下:
1sudo nano /etc/apache2/sites-available/xhgui.conf
将以下内容放入此文件中:
1[label /etc/apache2/sites-available/xhgui.conf]
2<VirtualHost *:80>
3 DocumentRoot /var/www/xhgui/webroot
4 ServerName xhgui.example.com
5
6 <Directory "/var/www/xhgui/webroot">
7 Options Indexes MultiViews FollowSymLinks
8 AllowOverride All
9 Require all granted
10 </Directory>
11</VirtualHost>
请注意,文档根应该指向XHGui的主目录中的子目录webroot
。
<$>[注]
如果你目前没有一个子域,你可以使用这个虚拟主机,你可以使用一个愚蠢的域名,并在你的本地 /etc/hosts
文件中创建一个条目,指向你设置到服务器的 IP 地址的 ServerName
。
启用虚拟主机:
1sudo a2ensite xhgui
若要应用这些更改,请重新加载 Apache:
1sudo service apache2 reload
在 LEMP 上设置 XHGui 的虚拟主机
首先,在 /etc/nginx/sites-available
上创建一个新的虚拟主机文件:
1sudo nano /etc/nginx/sites-available/xhgui
将以下内容放入此文件中:
1[label /etc/nginx/sites-available/xhgui]
2server {
3 listen 80;
4 server_name xhgui.example.com;
5 root /var/www/xhgui/webroot/;
6 index index.php;
7
8 location / {
9 try_files $uri $uri/ /index.php?$uri&$args;
10 }
11
12 location ~ \.php$ {
13 try_files $uri =404;
14 fastcgi_split_path_info ^(.+\.php)(/.+)$;
15 fastcgi_pass unix:/var/run/php5-fpm.sock;
16 fastcgi_index index.php;
17 include fastcgi_params;
18 }
19}
请注意,文档根应该指向XHGui的主目录中的子目录webroot
。
<$>[注]
如果你目前没有一个子域,你可以使用这个虚拟主机,你可以使用一个愚蠢的域名,并在你的本地 /etc/hosts
文件中创建一个条目,指向你设置的 server_name
服务器的 IP 地址。
要启用新的虚拟主机,运行:
1sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui
现在,重新启动 Nginx 来应用这些更改:
1sudo service nginx restart
步骤6 — 设置 XHProf
在此时,您应该能够从您的浏览器访问XHGui的界面,访问您在Web服务器配置中指定的服务器名称。
XHProf 扩展已经安装在服务器上,但我们仍然需要为您的应用程序激活配置文件的过程。这通常是通过在您的 Web 服务器上添加一个 PHP 指令来完成的,该指令会自动为所有正在执行的 PHP 脚本预订一个代码。重要的是要指出,默认情况下,XHProf 只会对应用程序提出 100 个请求中的 1 个。
XHGui提供了一个默认的PHP标题,您可以预先将其用于您的脚本,以便为您的应用程序初始化配置文件。如果您遵循了本教程中的所有步骤,标题文件应该位于 /var/www/xhgui/external/header.php
。
接下来的部分将向您展示如何在Apache和Nginx环境中的所有PHP脚本自动预订此标题文件. 对于这个示例,我们将允许为托管作为该服务器上的主要网站的WordPress应用程序进行配置。
在 Apache 上创建配置文件
在本示例中,我们将允许对本服务器上托管的主要Apache网站进行配置,定义为 /etc/apache2/sites-available/000-default.conf
。
1sudo nano /etc/apache2/sites-available/000-default.conf
包括现有<VirtualHost>
块中的突出行:
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3 ...
4 php_admin_value auto_prepend_file "/var/www/xhgui/external/header.php"
5 ...
6</VirtualHost>
保存文件并退出. 重新启动 Apache 以应用更改:
1sudo service apache2 restart
在 Nginx 上创建配置文件
在本示例中,我们将启用在这个服务器上托管的默认
网站的配置文件,定义为/etc/nginx/sites-available/default
。
1sudo nano /etc/nginx/sites-available/default
现在寻找定义如何处理.php
脚本的区块,包括该区块内的突出行:
1[label /etc/nginx/sites-available/default]
2 location ~ \.php$ {
3 ...
4 fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/xhgui/external/header.php";
5 ...
6}
保存文件并退出. 重新启动 Nginx 以应用更改:
1sudo service nginx restart
第7步:开始使用XHGui
现在一切都已经正确设置,但取决于您的网站通常会看到多少次,可能需要一些时间才能在 XHGui 中显示第一个配置数据,这是因为默认情况下,XHProf 只会收到 100 个请求中的 1 个。
XHGui 概览
当配置信息可用时,您应该看到这样的页面:
下面您可以在本概述表中找到每个字段的简要描述:
- ** 方法:** 分析请求中使用的方法
- URL:** 被配置的 URL
- ** 时间:** 这个配置数据收集的时间
- wt (墙时间): 这个请求完成需要多长时间
- cpu: 处理器执行这个请求所花费的时间
- mu (内存使用): 这个请求中使用的平均内存
- pmu (峰值内存使用): 这个请求中使用的最大内存
要查看配置文件的详细信息,请使用 time 字段中的链接,您应该看到这样的页面:
在左侧,您可以看到有关被分析的请求的信息,如使用的方法、脚本名称和URL、请求参数等。在主页内容中,您可以识别执行时间最长的函数或方法,以及具有较高的内存消耗的函数或方法。
检查函数呼叫
如果您向下滚动到页面的底部,您将可以访问一个表,其中包含有关此请求中执行的所有函数调用的详细信息,包括函数或方法的执行次数、运行时间、使用的内存次数以及许多其他有趣的细节。
比较运行
XHGui最有用的功能之一是比较工具,您可以使用它来比较两个不同的配置运行。
在查看一组个人资料数据时,在观看功能
部分的右侧,你可以看到一个名为比较此运行
的按钮。点击此按钮将向你显示针对该特定 URL 执行的所有配置文件的列表,在那里你可以选择列表中的一个项目来生成比较视图。
这就是比较视图的样子:
结论
配置文件是软件优化的一个重要技术,它为您提供了代码级的应用程序的详细见解,通过XHProf和XHGui等工具,您可以有效地识别代码中的有问题的部分,并监控代码变更对应用程序性能的影响。
有关 XHGui 可用的配置选项的更多信息,请参阅官方 Github 存储库。