如何设置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。


    1. 先决条件

为了遵循本指南,您需要:

  • 具有非 root sudo 用户的 Ubuntu 14.04 服务器,您可以按照我们的 初始服务器设置 指南进行设置
  • 运行将被分析的 PHP 应用程序的功能性 PHP Web 服务器环境

当您准备好继续前进时,使用您的 sudo 帐户登录您的服务器。 ##Step 1 — 安装服务器依赖项 如果您的服务器上没有安装 pecl,您现在应该安装它。 我们需要它来设置 xhprofmongo 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
    1. Step 2 — 安装 XHProf 现在我们应该安装并启用 XHProf。 要通过 pecl 安装它,请运行:
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
    1. Step 3 — 安装 MongoDB 下一步是在服务器上安装 MongoDB 和 mongo PHP 扩展。 XHGui使用MongoDB来存储XHProf的应用分析得到的数据。

要安装 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
...
    1. 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
    1. 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 创建虚拟主机。

      1. 在 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
      1. 在 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
    1. 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
    1. Step 7 — XHGui 入门

现在一切都已正确设置,但取决于您的网站通常获得的浏览量,可能需要一些时间才能在 XHGui 中显示第一个分析数据。 这是因为默认情况下 XHProf 将只分析收到的 100 个请求中的 1 个。 您可能需要浏览您的网站并重新加载几次,然后才能使用任何个人资料数据。

      1. XHGui 概述

当分析信息可用时,您应该会看到如下页面:

您可以在下面找到此概览表中每个字段的快速说明:

  • Method: 分析请求中使用的方法
  • URL: 分析的 URL
  • Time: 收集此分析数据的时间
  • wt (Wall Time): 这个请求需要多长时间才能完成
  • cpu: CPU执行这个请求所花费的时间
  • mu (Memory Usage): 此请求期间使用的平均内存
  • pmu (Peak Memory Usage): 此请求期间的内存使用峰值

要查看分析运行的详细信息,请使用 time 字段中的链接。 你应该看到这样的页面:

在左侧,您可以看到有关已分析请求的信息,例如使用的方法、脚本名称和 URL、请求参数等。 在主页面内容中,您可以识别出执行时间最长的函数或方法,以及内存消耗较高的函数或方法。 所有这些信息都与特定的分析运行和请求有关。

      1. 检查函数调用

如果您向下滚动到页面底部,您将可以访问一个表格,其中包含有关在此请求期间执行的所有函数调用的详细信息,包括函数或方法执行了多少次、运行了多长时间、多少它使用的内存,以及许多其他有趣的细节。 您可以使用表头通过这些参数中的任何一个对列表进行排序。 您还可以使用右侧的搜索框来搜索特定的函数或方法名称。

      1. Comparing 运行 XHGui 最有用的功能之一是比较工具,您可以使用它来比较两个不同的分析运行。 这使您能够对代码进行更改并比较多次运行,以查看您的更改是否会为应用程序带来任何性能提升。

在查看一组配置文件数据时,在 Watch Functions 部分的右侧,您可以看到一个名为 Compare This Run 的按钮。 单击此按钮将显示为该特定 URL 执行的所有分析运行的列表,您可以在其中选择列表中的一项以生成比较视图。 只需选择要比较的运行,然后单击 Compare 按钮。

这是比较视图的样子:

##结论

分析是软件优化的一项重要技术,可以在代码级别为您提供有关应用程序的详细见解。 借助 XHProf 和 XHGui 等工具,您可以有效地识别代码中的问题部分,并监控代码更改对应用程序性能的影响。

有关 XHGui 可用配置选项的更多信息,请查看官方 Github 存储库