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