讲师中心 微信公众号
AI工具推荐 视频效率加速

使用xhprof进行线上PHP性能追踪及分析

夜墨姑娘_9960

夜墨姑娘_9960

发布时间:2016-08-08 09:29:53

|

1098人浏览过

|

来源于php中文网

原创

之前一直使用基于Xdebug进行PHP的性能分析,对于本地开发环境来说是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析。xhprof的安装与简易用法xhprof是Facebook开源的轻量级PHP性能分析工具,Linux环境下可以通过pecl直接安装,比如在Ubuntu下仅需3行指令
pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm re<span><span>start</span></span>
之后可以通过phpinfo()检查扩展是否已经加载。具体如何使用呢,xhprof项目中已经提供了示例以及简易的UI,下载xhprof项目到web服务器,假设可以通过http://localhost/xhprof/访问,那么访问http://localhost/xhprof/examples/sample.php可以看到一些输出,并且提示通过访问http:///index.php?run=XXX&source=xhprof_foo查看结果。接下来访问http://localhost/xhprof/xhprof_html/就可以看到已经保存的结果,列出了所有函数的调用以及所消耗的时间。分析一下示例代码sample.php,关键部分只有2行:
<span>//开启xhprof并开始记录</span>
xhprof_enable();
<span>//运行一些函数</span>
foo();
<span>//停止记录并取到结果</span><span>$xhprof_data</span> = xhprof_disable();
$xhprof_data中记录了程序单步运行过程中所有的函数调用时间及CPU内存消耗等,具体记录哪些指标可以通过xhprof_enable的入口参数控制,之后的处理已经与xhprof扩展无关,大致是编写了一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp。xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了:
  • funciton name : 函数名
  • calls: 调用次数
  • Incl. Wall Time (microsec): 函数运行时间(包括子函数)
  • IWall%:函数运行时间(包括子函数)占比
  • Excl. Wall Time(microsec):函数运行时间(不包括子函数)
  • EWall%:函数运行时间(不包括子函数)
  • 每一项应该不难理解,以项目自带的sample.php为例,示例中编写了一个main()函数,main()函数中调用foo()、bar()等一些子函数进行了一点字符处理。整个程序运行过程中,main()函数只运行了一次,并且由于main()函数中包括了所有的逻辑,所以main()函数的IWall%占比为100%,但是由于main()函数的功能都是由子函数实现的,因此main()函数的EWall%只有0.3%,而foo()函数完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序时,往往需要根据这几项指标分别排序,从不同的角度审视性能消耗。在xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,ubuntu可以通过apt安装
    apt-get install graphviz
    
    更好的注入方式了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑
    <span>//开启xhprof</span>
    xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
    <span>//在程序结束后收集数据</span>
    register_shutdown_function(<span>function</span>() {
        $xhprof_data        = xhprof_disable();
    
        <span>//让数据收集程序在后台运行</span><span>if</span> (function_exists(<span>'fastcgi_finish_request'</span>)) {
            fastcgi_finish_request();
        }
    
        <span>//保存xhprof数据</span>
        ...
    });
    
    但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件
    vi /etc/php5/fpm/php.ini
    
    修改auto_prepend_file配置
    <span>auto_prepend_file = <span>/opt/inject.php</span></span>
    这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。
    fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";
    
    更好的分析工具:xhprof.io还是xhpgui注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,听起来似乎又是一大堆工作,有现成的轮子可以用吗?经过搜索和比较,貌似比较好的选择有xhprof.io以及xhpgui。两个项目做得事情差不多,都提供了xhprof数据保存功能以及一套索引展示数据的UI,下面是一些比较xhprof.io
  • ? 年久失修
  • ? 保存xhprof数据到MySQL
  • ? 支持域名、URI等多个维度的数据索引
  • ? 函数调用记录完整,内核级别函数都能显示
  • ? 无法针对个别URI开启
  • ? 注入被分割成两个文件,如果程序被强制中断时xhprof数据将无法收集
  • xhgui
  • ? 保存xhprof数据到MongoDB
  • ? 不支持域名索引
  • ? 函数调用记录不完整,部分内核级别函数(如扩展内)无法显示
  • ? 有配置文件可以控制开启条件
  • ? 注入只有一个文件
  • ? 狂拽酷炫的基于D3.js的调用关系动态图
  • 可以看到其实两个项目都不够完善,相对而言xhgui不支持域名索引对于线上调试来说是无法忍受的,因此我最后的选择是使用xhprof.io,但是自己进行了微量的调整,修改后的xhprof.io修正版支持:
  • ? 增加开启开关配置,可以针对个别URI开启
  • ? 注入文件合并为一个
  • xhprof.io修正版安装与使用安装及配置方法如下,假设web服务器根目录为/opt/htdocs
    cd /opt/htdocs
    git <span>clone</span> https:<span>//github.com/EvaEngine/xhprof.io.git</span>
    cd xhprof.io/
    composer install
    cp xhprof/includes/config.inc.sample.php xhprof/includes/config.inc.php 
    vi xhprof/includes/config.inc.php
    
    在MySQL中建立xhprof.io数据库,假设数据库名为xhprof,然后导入xhprof/setup/database.sql配置文件config.inc.php中需要调整
  • 'url_base' => 'http://localhost/xhprof.io/', 这是xhprof.io界面所在路径
  • 'pdo' => new PDO('mysql:dbname=xhprof;host=localhost;charset=utf8', 'root', 'password'), 根据MySQL实际情况调整配置
  • enable 这是一个匿名函数,当匿名函数返回true时启用xhprof数据收集
  • 通过配置enable项,就可以实现线上调试的需求,比如始终开启xhprof
    <span>'enable'</span> => <span>function</span>() {
        <span>return</span><span>true</span>;
    }
    
    1/100概率随机开启xhprof
    <span>'enable'</span> => <span>function</span>() {
        <span>return</span> rand(<span>0</span>, <span>100</span>) === <span>1</span>;
    }
    
    网页携带参数debug=1时开启xhprof
    <span>'enable'</span> => function() {
        <span>return</span> !<span>empty</span>(<span>$_GET</span>[<span>'debug'</span>]);
    }
    
    网页URL为特定路径时开启
    <span>'enable'</span> => function() {
        <span>return</span> strpos(<span>$_SERVER</span>[<span>'REQUEST_URI'</span>], <span>'/testurl'</span>) === <span>0</span>;
    }
    
    最后按上文所述,在要配置的项目中包含xhprof.io/inc/inject.php即可。线上环境操作时务必要胆大心细,如果没有结果尤其注意需要检查xhprof扩展是否安装。附录:xhpgui的安装方法
    apt-get install mongodb php5-mongo php5-mcrypt
    cp /etc/php5/mods-available/mcrypt.ini /etc/php5/fpm/conf.d/
    cp /etc/php5/mods-available/mcrypt.ini /etc/php5/cli/conf.d/
    cd /opt/htdocs
    git <span>clone</span> https:<span>//github.com/perftools/xhgui.git</span>
    cd xhgui
    composer install
    cp config/config.<span>default</span>.php config/config.php
    chown www-data.www-data -R cache
    
    编辑Nginx配置文件加入
    fastcgi_param PHP_VALUE "auto_prepend_file=/opt/htdocs/xhgui/external/header.php";
    
    收集数据过多时可以清空mongodb
    mongo
    <span>use</span> xhprof;
    db.dropDatabase();

    以上就介绍了使用xhprof进行线上PHP性能追踪及分析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

    相关文章

    数码产品性能查询
    数码产品性能查询

    该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

    下载

    相关标签:

    php

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    超级简历WonderCV

    一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

    二狗PPT
    二狗PPT Hot

    一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    SkildArt
    SkildArt Hot

    SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

    立刻MV
    立刻MV Hot

    立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    UpDream
    UpDream Hot

    一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    讯飞智作

    讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

    相关专题

    更多
    Buffalo框架数据库开发全教程
    Buffalo框架数据库开发全教程

    本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

    60

    2026.09.23

    Buffalo框架路由与请求处理实操指南
    Buffalo框架路由与请求处理实操指南

    本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

    20

    2026.09.23

    Buffalo框架零基础入门教程
    Buffalo框架零基础入门教程

    本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

    20

    2026.09.23

    Conan创建软件包配方指南
    Conan创建软件包配方指南

    本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

    20

    2026.09.22

    Conan二进制包配置指南
    Conan二进制包配置指南

    本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

    20

    2026.09.22

    Conan私有仓库搭建教程
    Conan私有仓库搭建教程

    本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

    20

    2026.09.22

    loomy官网入口地址合集
    loomy官网入口地址合集

    本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

    20

    2026.09.22

    NumPy常见函数使用方法
    NumPy常见函数使用方法

    本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

    40

    2026.09.22

    NumPy性能优化版本更新与常见报错排查
    NumPy性能优化版本更新与常见报错排查

    本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

    60

    2026.09.22

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    墨刀帮助中心
    墨刀帮助中心

    共0课时 | 0人学习

    MyEclipse学习中心
    MyEclipse学习中心

    共0课时 | 0人学习

    Apache Subversion 官方手册
    Apache Subversion 官方手册

    共0课时 | 0人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn