使用Thinkphp6开发api性能测试
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即可返回查询结果
二、使用Thinkphp6封装:
在controller目录下新建一个Api.php控制器,把iplocation.php的内容复制到tp6的控制器下,新建一个方法iplocation,function内代码流程和源生一致
再把iplocation_class的目录复制到extend目录下修改下目录名,即可自动引用
实际测试:
分别访问这两个地址,在相同的运行环境下查询相同IP地址看看响应速度
为公平起见,两个地址交替测试,分别10次取平均值
测试结果:
1、源生php文件取得了平均在8ms响应结果的成绩,其中代码流程基本在3ms内跑完
2、thinkphp6下,平均需要170ms跑完流程,去掉头尾请求时间,其中代码运行时间165ms
测试框架 | 平均单次响应时间 | 每秒能查询次数 |
源生PHP | 8ms | 125次 |
Thinkphp 6.0 | 170ms | 6次 |
很意外啊,一个简单的api接口测试,相差了20倍的速度。对于加载可视化的html页面来说,单次打开页面相差个几百毫秒都感觉不太明显,但是api和html页不同,更注重响应速度的
就像笔者所在公司开发的这么一个后台页面,假设列表页面要显示10条ip记录,后端渲染时要同步循环调用api接口查询ip地址,源生PHP接口仅需要80ms即可完成,用户基本无感知,而使用tp开发的api接口,需要1.7s,可感觉明显的卡顿,这可真是要命
为什么呢??
笔者进一步对运行流程进行进一步分析,发现瓶颈出现在磁盘IO上。 由于源生PHP只需要读取3个文件,即php查询入口文件,ip地址读取主程序php,dat数据库文件
而tp6.0,从入口文件index.php到最终输出结果,整体流程跑下来,竟然读取了110个框架文件,过于碎片化的文件导致了磁盘IO瓶颈
由于笔者电脑数据盘使用的是普通机械硬盘,而服务器的数据盘用的也是非SSD,看来还是舍弃tp框架,用源生吧。