xDebug + webgrind 对 php 程序进行性能分析
环境
macOs Sierra
php 7.0.8
MAMP Pro 集成环境
背景
最近有一个需要在微信朋友圈上线的 h5,本人做了一个抽奖的接口,也没多想,直接上 php ci(CodeIgniter)框架。
按照腾讯方的要求,需要 ab 测试,在总请求数 15000,并发 500 下平均响应时间小于 200ms。
谁知道等开发完毕,ab 跑完,响应时间直飚近 400ms。
所以接下来借助 php 强大的 xDebug 扩展和 webgrind 来查看代码调用耗时情况。
1、添加 php 的 xDebug 扩展
因为 MAMP Pro 自带 xDebug 扩展,所以直接开启就好:

2、php.ini 配置中开启 Profiler(性能跟踪器)
Profiler工作方式类似于函数追踪,是在脚本程序运行时自动将性能记录文件保存下来。
[php.ini]
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
3、下载 webgrind
因为 xDebug 的 Profiler 生成的性能记录文件的格式,不是给人看的:

所以需要下载图形界面的分析工具,Linux KDE 可以用 KChaceGrind,windows 下可以用 winChaceGrind ,Mac 上没有发现合适的桌面端软件,所以用 Web 版的 webgrind 是最好的选择。
Github 地址:https://github.com/jokkedk/webgrind
下载后直接放在本地服务器根目录直接访问就行:
4、使用方法
把需要分析的 url 后面接上 ?XDEBUG_PROFILE,例如:
http://localhost/XXX/index.php/PriceApply/getPrice?XDEBUG_PROFILE
然后刷新 webgrind 网页,新的数据会出现:

下面介绍下 webgrind 的一些参数含义:

第一个选项:webgrind 把所有被调用函数/方法首先做一个排序,由高到低显示。然后取出前 N 个,使他们耗时比率之和在 90-100% 之间。
要注意的是,最好不要选择100%,这样将会显示所有被调用的函数/方法,如果是一个代码复杂的页面,那么webgrind偶尔会被卡死。并且通常我们只要关注耗时前几 > 名的函数即可。
第二个选项:选择 profile 文件。默认是分析最新一次的 xdebug 记录。如果之前设置好路径和记录机制那么我们就会发现下拉列表里有很多选项。
第三个选项:显示百分比/毫秒/微秒。
彩色进度条:蓝代表 php 内置函数,灰代表 require/include,绿代表类方法,橙黄代表过程函数 (用户自定义函数)

invocation count - 表示整个 php 页面从载入到执行完毕呈现,各种函数被调用的总次数
total self cost - 表示函数自身消耗
total inclusive cost - 表示此函数从开始到执行完毕所用消耗 ,包括自身消耗和调用其他函数消耗
点击一个父函数名后出现展开:
Calls - 此函数中调用并执行的所有函数/方法名、次数及耗时
Total Call Cost - 被此父函数调用时,执行的总耗时
Count - 被此父函数调用时,执行的次数
5、分析数据

如上图,最耗时的并不是我认为的抽奖模块,而是 ci 框架本身 + 数据库
让我再进一步瞧瞧:

如上图,在 load_class 项目里,最耗时的涉及 ci 框架重要模块的加载,包括URL、Hooks、Config、Router、Output模块,这些都是 ci 框架易用性的保障,除了Hooks 可以在 config 文件里禁用,绝大多数应该不能关闭。

再来看 DB 项,最耗时的是数据库的初始化

最后一项,是 ci 的系统核心层,最耗时的是 model 的构造过程,仍是初始化
结论
借用《主流 PHP 框架性能评测》(https://gold.xitu.io/entry/578ef4d6d342d30058e17d98) 文中的数据分析图(柱状图越高性能越好)

框架有利有弊,利是方便开发,易用稳定,弊端可能就是不管你的实际需求,初始化加载很多用不到的功能。
所以:
在涉及微小型的接口开发,建议采用原生 php 。
在涉及复杂型接口时,采用框架的同时,适当开启 php 缓存,比如 APC 和 OPcache,都可以让性能得到一些提升,弥补使用框架的不足。
xDebug + webgrind 对 php 程序进行性能分析的更多相关文章
- Linux C++程序进行性能分析工具gprof使用入门
性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...
- [转]程序进行性能分析工具gprof使用入门
性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...
- 使用xhprof对php7程序进行性能分析
Xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开关来控制是否进行profile. 对于还在使用php5的 ...
- 实验-使用VisualVM或JConsole进行对程序进行性能分析
参考资料: 性能分析神器VisualVM java可视化监控工具 完成下列任务: 1.分析内存堆 使用+进行频繁的字符串拼接 2.CPU性能分析 3.线程分析 编程比较以下几个方法所创建的线程 Exe ...
- ubuntu上编译和使用easy_profiler对C++程序进行性能分析
本文首发于个人博客https://kezunlin.me/post/91b7cf13/,欢迎阅读最新内容! tutorial to compile and use esay profiler with ...
- 用 dotTrace 进行性能分析时,各种不同性能分析选项的含义和用途
对 .NET 程序进行性能分析,dotTrace 能应对绝大多数的场景.在开启一个进程进行性能分析之前,我们会看到一些性能分析选项(Profiler Options).本文将介绍这几个选项的含义,并用 ...
- 使用VisualVM进行性能分析及调优(转)
VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- [转]设置Android手机以使用ARM Streamline进行性能分析(二)
原文因为arm社区改版访问不到了,原作者鲍方,原文地址,这篇是从google cache里挖出来的,希望能帮到要对cocos2dx优化的各位 Posted by Fang Bao, Leave C ...
- 使用 VisualVM 进行性能分析及调优
VisualVM 是一款免费的性能分析工具.它通过 jvmstat.JMX.SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态 ...
随机推荐
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]
上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...
- 初步认识TDD
TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识. 基础属性 ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- JQuery 选择器
选择器是JQuery的根基,在JQuery中,对事件的处理,遍历DOM和AJAX操作都依赖于选择器.如果能够熟练地使用选择器,不仅能简化代码,而且还可以事半功倍. JQuery选择器的优势 1.简洁的 ...
- 奇葩问题-TextView无法获取值
问题场景 前几天写一个界面的时候,遇到一个非常奇葩的问题.app第一次安装的时候,这里针对用户第一次安装的时候,后来是不会出现这个问题了.我明明是对某个界面的一个textview赋值了,而且服务端也返 ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- Javascript学习笔记
Javascript 2016年12月19日整理 JS基础 Chapter1 JS是一门运行在浏览器客户端的脚本编程语言,前台语言 组成部分 1. ECMAscript JS标准 2. DOM 通过J ...
- SQLServer如何添加try catch
在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...