macOs Sierraphp
php 7.0.8git
MAMP Pro 集成环境github
最近有一个须要在微信朋友圈上线的 h5,本人作了一个抽奖的接口,也没多想,直接上 php ci(CodeIgniter
)框架。web
按照腾讯方的要求,须要 ab 测试,在总请求数 15000,并发 500 下平均响应时间小于 200ms。数据库
谁知道等开发完毕,ab 跑完,响应时间直飚近 400ms。windows
因此接下来借助 php 强大的 xDebug
扩展和 webgrind
来查看代码调用耗时状况。缓存
由于 MAMP Pro 自带 xDebug 扩展,因此直接开启就好:服务器
Profiler
工做方式相似于函数追踪,是在脚本程序运行时自动将性能记录文件保存下来。微信
[php.ini]并发
xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 1
由于 xDebug 的 Profiler 生成的性能记录文件的格式,不是给人看的:
因此须要下载图形界面的分析工具,Linux KDE 能够用 KChaceGrind
,windows 下能够用 winChaceGrind
,Mac 上没有发现合适的桌面端软件,因此用 Web 版的 webgrind 是最好的选择。
Github 地址:https://github.com/jokkedk/webgrind
下载后直接放在本地服务器根目录直接访问就行:
把须要分析的 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 - 被此父函数调用时,执行的次数
如上图,最耗时的并非我认为的抽奖模块,而是 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,均可以让性能获得一些提高,弥补使用框架的不足。