如何在 Ubuntu 14.04 上设置 XHProf 和 XHGui 以剖析 PHP 应用程序

介绍

在软件工程中,配置文件是一种用于在运行时分析应用程序的技术,以便在应用程序中识别可能的瓶颈和性能问题. 它是软件优化的一个必不可少的资源。

一个 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和mongoPHP扩展安装在服务器上。

要安装 MongoDB,请运行:

1sudo apt-get install mongodb

要安装 MongoDB PHP 扩展,请运行:

1sudo pecl install mongo

安装程序会要求您在某个时刻输入,以选择是否要为 MongoDB 启用企业身份验证。

现在我们需要激活mongoPHP扩展,按照我们使用的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服务器配置中指定的服务器名称。

Image 01: XHGui First Run

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 概览

当配置信息可用时,您应该看到这样的页面:

Image 02: XHGui Overview

下面您可以在本概述表中找到每个字段的简要描述:

  • ** 方法:** 分析请求中使用的方法
  • URL:** 被配置的 URL
  • ** 时间:** 这个配置数据收集的时间
  • wt (墙时间): 这个请求完成需要多长时间
  • cpu: 处理器执行这个请求所花费的时间
  • mu (内存使用): 这个请求中使用的平均内存
  • pmu (峰值内存使用): 这个请求中使用的最大内存

要查看配置文件的详细信息,请使用 time 字段中的链接,您应该看到这样的页面:

Image 03: Profiling Data

在左侧,您可以看到有关被分析的请求的信息,如使用的方法、脚本名称和URL、请求参数等。在主页内容中,您可以识别执行时间最长的函数或方法,以及具有较高的内存消耗的函数或方法。

检查函数呼叫

如果您向下滚动到页面的底部,您将可以访问一个表,其中包含有关此请求中执行的所有函数调用的详细信息,包括函数或方法的执行次数、运行时间、使用的内存次数以及许多其他有趣的细节。

Image 04: XHGui Function Calls

比较运行

XHGui最有用的功能之一是比较工具,您可以使用它来比较两个不同的配置运行。

在查看一组个人资料数据时,在观看功能部分的右侧,你可以看到一个名为比较此运行的按钮。点击此按钮将向你显示针对该特定 URL 执行的所有配置文件的列表,在那里你可以选择列表中的一个项目来生成比较视图。

这就是比较视图的样子:

Image 05: XHGui Comparing Runs

结论

配置文件是软件优化的一个重要技术,它为您提供了代码级的应用程序的详细见解,通过XHProf和XHGui等工具,您可以有效地识别代码中的有问题的部分,并监控代码变更对应用程序性能的影响。

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

Published At
Categories with 技术
comments powered by Disqus