使用Thinkphp6开发api性能测试

oy2022-03-20测评体验178

tp6号称为api开发而生,那么笔者今天就来测试一下这款tp6性能如何


最开始接触thinkphp是在3.2的版本,后续又用到了5.0来开发应用,总体来说还是比较方便的

虽然Laravel框架近年来非常的流行,但是习惯了一套框架,也懒得去摸索其他框架了


同行朋友很早就提过Laravel的路由模式很强,而现在tp6和Laravel相似度达到了70~80%,看得出来thinkphp的作者也是吸纳借鉴了很多Laravel的优点


刚好最近在做一个新项目,就上tp6吧,这个项目还包含了对外提供api接口的能力,试试tp6性能如何


安装官网说明,已不再提供压缩包下载,只能使用composer安装

composer create-project topthink/think tp


当前的版本是官网最新的ThinkPHP V6.0.12,全新安装,只包含默认的插件并且关闭调试模式,以部署模式运行(模拟生产环境)


现在来开发一个简单的IP地址查询api,分别使用源生php和tp6开发进行对比,懒得上服务器了,直接用本地环境来测试


本地测试环境:

windows 10

apache 2.4.39

php 7.2.9 nts

(均为默认配置,未调优,不加缓存,也没有设置伪静态啥的)


一、源生PHP

只会框架的不是好程序员,对于笔者来说,源生PHP更简单了,一个php主程序,一个class目录组成。

直接调用iplocation.php?ip=1.1.1.1即可返回查询结果

微信截图_20220320193704.png


二、使用Thinkphp6封装:

在controller目录下新建一个Api.php控制器,把iplocation.php的内容复制到tp6的控制器下,新建一个方法iplocation,function内代码流程和源生一致

再把iplocation_class的目录复制到extend目录下修改下目录名,即可自动引用


实际测试:

分别访问这两个地址,在相同的运行环境下查询相同IP地址看看响应速度

为公平起见,两个地址交替测试,分别10次取平均值


测试结果:

1、源生php文件取得了平均在8ms响应结果的成绩,其中代码流程基本在3ms内跑完

微信截图_20220320194110.png


2、thinkphp6下,平均需要170ms跑完流程,去掉头尾请求时间,其中代码运行时间165ms

微信截图_20220320194033.png




测试框架平均单次响应时间每秒能查询次数
源生PHP8ms125次
Thinkphp 6.0170ms6次


很意外啊,一个简单的api接口测试,相差了20倍的速度。对于加载可视化的html页面来说,单次打开页面相差个几百毫秒都感觉不太明显,但是api和html页不同,更注重响应速度的


就像笔者所在公司开发的这么一个后台页面,假设列表页面要显示10条ip记录,后端渲染时要同步循环调用api接口查询ip地址,源生PHP接口仅需要80ms即可完成,用户基本无感知,而使用tp开发的api接口,需要1.7s,可感觉明显的卡顿,这可真是要命

微信截图_20220321055136.png


为什么呢??


笔者进一步对运行流程进行进一步分析,发现瓶颈出现在磁盘IO上。 由于源生PHP只需要读取3个文件,即php查询入口文件,ip地址读取主程序php,dat数据库文件

而tp6.0,从入口文件index.php到最终输出结果,整体流程跑下来,竟然读取了110个框架文件,过于碎片化的文件导致了磁盘IO瓶颈


由于笔者电脑数据盘使用的是普通机械硬盘,而服务器的数据盘用的也是非SSD,看来还是舍弃tp框架,用源生吧。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。