Linux系统下使用XHProf和XHGui分析PHP运行性能
《:Linux系统下使用XHProf和XHGui分析PHP运行性能》要点: PHP应用什么是性能分析? 如果你不这样做,将会陷入一个陷阱――过早优化,这可能会浪费你的时间. 为了评断应用是否存在性能问题,你应该确定性能目标.例如,100 个并发用户的响应时间小于 1s .然后,你需要进行基准测试,看是否达到这个目标.一个常见的错误是,在开发环境进行基准测试.事实上,你必须在生产环境进行基准测试.(实际生产环境或模拟的生产环境,后者很容易在 SaaS 实现. 一旦你确定应用存在性能问题,就需要分析其性能,实施改进,然后再一次进行基准测试,查看问题是否办理.每一次变更之后,你都该进行基准测试查看效果.如果你做了很多变更,却发现应用性能有所下降,你就无法确定具体是哪一次变更导致了这个问题. 下图是我定义的性能生命周期: 性能下降的一般原因 数据存储
外部资源
选择哪一种性能分析器? 主动 VS 被动性能分析 因为无法在生产环境中使用主动分析器,Facebook 推出了一个被动分析器――XHProf.XHProf 是为了在生产环境中使用而打造的.它对性能的影响最小,同时收集足够的信息用于诊断性能问题.XHProf 和 OneAPM 都是被动分析器. 通常,XDebug 收集的额外信息对于一般的性能问题分析并不必要.这意味着,被动分析器是用于不间断性能分析的更佳选择,即使是在开发环境中. XHProf + XHGui 安装 $ pecl install xhprof-beta 该 pecl 命令将尝试自动更新你的 php.ini 设置.pecl 尝试更新的文件可以使用以下命令找到: $ pecl config-get php_ini 它会在指定的文件(如果有的话)顶部增加新的配置行.你可能想把他们移到一个更合适的位置. 一旦你编译了该扩展程序,您必须启用它.为此,您需要在 PHP INI 文件添加以下代码: [xhprof] extension=xhprof.so 之后,结合 XHGui 就能轻松地执行性能分析与检查. 安装 XHGui XHGui 要求:
首先,克隆项目到任意位置.在基于 Debian 的 Linux 系统(例如 Ubuntu 等等),可能是 /var/www.在 Mac OS X 系统,可能是 /Library/WebServer/Documents. $ cd /var/www $ git clone https://github.com/perftools/xhgui.git $ cd xhgui $ php install.php 最后一个命令是运行 composer 以安装依赖并检查 XHGui 缓存目录的权限.如果失败,你可以手动运行 composer install. 下一步,你可能需要创建配置文件.这一步很容易实现,可以使用在 /path/to/XHGui/config/config.default.php 下的默认配置文件. 如果你在本地运行 MongoDB,没有身份验证,则可能不需要这样做.因为它将回退为默认值.而在多服务器环境中,你会需要一个所有服务器都能进行存储的远程 MongoDB 服务器,并进行恰当的配置. 为提高 MongoDB 的性能,你可以运行以下指令以添加索引: $ mongo > 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 } ) 其他配置 为此,请在 config.php 中进行以下修改: <?php 'save.handler' = 'file','save.handler.filename' => '/path/to/xhgui/xhprof-' .uniqid("",true). '.dat',?> 改变文件中的 save.handler,然后取消批注 save.handler.filename,为其赋一个恰当的值. 注意:默认每天只保存一个分析文件. 一旦分析数据的准备就绪,你就可以使用 XHGui 附带的脚本导入之: $php /path/to/xhgui/external/import.php /path/to/file.dat 在此之后的步骤都相同. 运行 XHGui 或者,你可以简单地使用 PHP 5.4+ cli-server 例如: $ cd /path/to/xhgui $ php -S 0:8080 -t webroot/ 这将使 XHGui 在所有网络接口都可通过 8080 端口进行通信.
运行性能分析器 对于 Apache 服务器,添加以下代码: php_admin_value auto_prepend_file "/path/to/xhgui/external/header.php" 对于 Nginx 服务器,在服务器配置中添加以下代码: fastcgi_param PHP_VALUE "auto_prepend_file=/path/to/xhgui/external/header.php"; 如果您使用 PHP 5.4+ cli-server(PHP -S),则必须通过命令行标记进行设置: $ php -S 0:8080 -dauto_prepend_file=/path/to/xhgui/external/header.php 默认情况下,分析器运行时只分析(大约) 1% 的哀求.这是由以下 external/header.php 代码控制的: <?php if (rand(0,100) !== 42) { return; } ?> 如果你想分析每一个哀求(例如,在开发阶段),你可以将这段代码注释掉.如果你想让分析 10% 的哀求,你可以做如下改动: <?php if (rand(0,10) !== 4) { return; } ?> 这允许你对一小部分用户哀求进行分析,而不过多影响单个用户或太多用户. 如果你想在性能分析时进行手动控制,你可以这样做: <?php if (!isset($_REQUEST['A9v3XUsnKX3aEiNsUDZzV']) && !isset($_COOKIE['A9v3XUsnKX3aEiNsUDZzV'])) { return; } else { // Remove trace of the special variable from REQUEST_URI $_SERVER['REQUEST_URI'] = str_replace(array('?A9v3XUsnKX3aEiNsUDZzV','&A9v3XUsnKX3aEiNsUDZzV'),'',$_SERVER['REQUEST_URI']); setcookie('A9v3XUsnKX3aEiNsUDZzV',1); } if (isset($_REQUEST['no-A9v3XUsnKX3aEiNsUDZzV'])) { setcookie('A9v3XUsnKX3aEiNsUDZzV',time() - 86400); return; } ?> 这段代码会检查一个随机命名的 GET/POST/COOKIE 变量(在此例中为:A9v3XUsnKX3aEiNsUDZzV),同时创建一个同名的 Cookie,用于分析该哀求的整个过程,例如:表单提交后的重定向,Ajax 哀求等等. 此外,它允许一个名为 no-A9v3XUsnKX3aEiNsUDZzV 的 GET/POST 变量来删除 Cookie,停止分析. 当然,我们欢迎大家尝试使用 OneAPM 来为您的 PHP 和 Java 应用做免费的性能分析.OneAPM 独有的探针能够深入到所有 PHP 和 Java 应用内部完成应用性能管理和监控,包含代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理. OneAPM 可以追溯到性能表现差的 SQL 语句 Traces 记录、性能表现差的第三方 API、Web 服务、Cache 等等. 编程之家培训学院每天发布《:Linux系统下使用XHProf和XHGui分析PHP运行性能》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |