PHP框架性能测试报告


Posted in PHP onMay 08, 2016

作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情。

用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情。不过很多第三方功能不需要自己写,众多大牛已经给铺好路了。

用Laravel的话,传说写起来很爽扩展性也够,但是学习成本有点高,总不能给初级开发者半个月的时间去学习框架吧。而且据说江湖人士透漏,Laravel性能不怎么样,文档也并不是特别丰富。

用Yii的话,语法有点??拢?昂蠖舜?敕掷胗械阈÷榉常?还?阅苁欠浅:玫模??乙丫?兄诙喙?诖蠊?驹谑褂昧耍?鱿忠馔饪梢钥焖俚恼业酱笈4鹨山饣蟆?/p>

不如做个简单的性能评测,选个性能出色的总不会出错

性能测试
测试时间: 2016年05月06日
测试工具: siege (因为MAC系统的ab总是会出现 pr_socket_recv: Connection reset by peer (54) 的错误,所以选择了siege)
测试机器: MacPro Core i5 处理器/8GB内存/256GB SSD闪存
测试环境: Apache PHP5.6
框架版本: ThinkPHP 3.2.3 Laravel 5.2 Yii2.0.5
测试原则: 每次测试循环5次,取中等数据
补充说明:所有项目都是让在子目录中

结果说明

Transactions:        2119 hits 处理请求总数量
Availability:        96.85 % 可用性
Elapsed time:        9.74 secs 运行时间
Data transferred:      1.31 MB 数据传输量
Response time:        0.60 secs 响应时间
Transaction rate:     217.56 trans/sec 每秒处理效率
Throughput:        0.13 MB/sec 每秒处理数据
Concurrency:       130.28 并发
Successful transactions:    2162 成功的请求
Failed transactions:       69 失败的请求
Longest transaction:      2.85 最长的单个请求
Shortest transaction:      0.01 最短的单个请求

开始测试

增加一个控制器,并在控制器中输入10000次HelloWorld

并发50循环10次:

首先向我们走来的是ThinkPHP,看上去还行

Transactions:         500 hits
Availability:       100.00 %
Elapsed time:        2.81 secs
Data transferred:      52.45 MB
Response time:        0.26 secs
Transaction rate:     177.94 trans/sec
Throughput:        18.67 MB/sec
Concurrency:        47.10
Successful transactions:     500
Failed transactions:        0
Longest transaction:      0.48
Shortest transaction:      0.03

然后是Laravle,嗯,略微有些失望

Transactions:         500 hits
Availability:       100.00 %
Elapsed time:        13.33 secs
Data transferred:      52.45 MB
Response time:        1.27 secs
Transaction rate:      37.51 trans/sec
Throughput:        3.93 MB/sec
Concurrency:        47.55
Successful transactions:     500
Failed transactions:        0
Longest transaction:      3.64
Shortest transaction:      0.07

最后赛前比较看好的Yii

Transactions:         500 hits
Availability:       100.00 %
Elapsed time:        4.84 secs
Data transferred:      52.45 MB
Response time:        0.46 secs
Transaction rate:     103.31 trans/sec
Throughput:        10.84 MB/sec
Concurrency:        47.65
Successful transactions:     500
Failed transactions:        0
Longest transaction:      0.88
Shortest transaction:      0.04

并发200循环10次:

首先是ThinkPHP

Transactions:        1977 hits
Availability:        98.85 %
Elapsed time:        10.03 secs
Data transferred:     207.40 MB
Response time:        0.95 secs
Transaction rate:     197.11 trans/sec
Throughput:        20.68 MB/sec
Concurrency:       187.68
Successful transactions:    1977
Failed transactions:       23
Longest transaction:      1.22
Shortest transaction:      0.02

然后是Laravel

Transactions:        1890 hits
Availability:        94.50 %
Elapsed time:        51.85 secs
Data transferred:     198.27 MB
Response time:        4.88 secs
Transaction rate:      36.45 trans/sec
Throughput:        3.82 MB/sec
Concurrency:       178.00
Successful transactions:    1890
Failed transactions:       110
Longest transaction:      26.01
Shortest transaction:      0.07

最后是Yii

Transactions:        1996 hits
Availability:        99.80 %
Elapsed time:        18.95 secs
Data transferred:     209.39 MB
Response time:        1.79 secs
Transaction rate:     105.33 trans/sec
Throughput:        11.05 MB/sec
Concurrency:       188.57
Successful transactions:    1996
Failed transactions:        4
Longest transaction:      3.29
Shortest transaction:      0.10

没想到在没有优化的情况下,ThinkPHP的速度是最快的,Yii略微多一些,Laravel步履蹒跚的跑完了测试。结果是有些出人意料的,不过上述的测试只代表了开发环境,下面会对框架进行优化,模拟线上环境。

优化框架

ThinkPHP:

APP_DEBUG改为false

Laravel:

APP_DEBUG改为false
php artisan route:cache
php artisan optimize
php artisan config:cache
composer dumpautoload -o

Yii:

YII_DEBUG改为false
composer dumpautoload -o
并发200循环10次:

ThinkPHP

Transactions:        1655 hits
Availability:        82.75 %
Elapsed time:        8.21 secs
Data transferred:     173.62 MB
Response time:        0.69 secs
Transaction rate:     201.58 trans/sec
Throughput:        21.15 MB/sec
Concurrency:       139.29
Successful transactions:    1655
Failed transactions:       345
Longest transaction:      7.83
Shortest transaction:      0.00

Laravel:

Transactions:        1520 hits
Availability:        76.00 %
Elapsed time:        34.95 secs
Data transferred:     159.45 MB
Response time:        3.15 secs
Transaction rate:      43.49 trans/sec
Throughput:        4.56 MB/sec
Concurrency:       136.84
Successful transactions:    1520
Failed transactions:       480
Longest transaction:      19.18
Shortest transaction:      0.00

Yii:

Transactions:        1704 hits
Availability:        85.20 %
Elapsed time:        15.16 secs
Data transferred:     178.76 MB
Response time:        1.46 secs
Transaction rate:     112.40 trans/sec
Throughput:        11.79 MB/sec
Concurrency:       164.21
Successful transactions:    1704
Failed transactions:       296
Longest transaction:      9.04
Shortest transaction:      0.00

比较奇怪的一点,当框架关掉调试模式后都出现了较多失败的情况。不过明显的看到,Laravel进行简单的优化后,性能大大的提升了,但还是低于其他两个框架。

结论

在测试的过程中,其他我的心情是沮丧的,感觉自己的三观世界已经崩塌了,崩塌至渣。

ThinkPHP的性能比Yii高出一倍,比Laravel高出近四倍
Yii的性能比较中庸,但是在测试中会明显发现请求失败的情况比其他两个框架要少
Laravel依旧优雅,不过性能堪忧,用网友的话形容比较好 学之者生用之者死

最后

我的项目最后使用了自建框架进行开发,得益于composer的强大,开发的过程非常顺利,最后附上自有框架在200并发10次循环的数据,框架开源但是更新比较忙,欢迎在github上搜索PPPHP,和我一起搭建框架。

Transactions:        1672 hits
Availability:        83.60 %
Elapsed time:        6.18 secs
Data transferred:     175.40 MB
Response time:        0.57 secs
Transaction rate:     270.55 trans/sec
Throughput:        28.38 MB/sec
Concurrency:       153.16
Successful transactions:    1672
Failed transactions:       328
Longest transaction:      4.57
Shortest transaction:      0.01
PHP 相关文章推荐
收集的PHP中与数组相关的函数
Mar 22 PHP
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 PHP
Thinkphp单字母函数使用指南
May 08 #PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 #PHP
PHP+Ajax+JS实现多图上传
May 07 #PHP
php实现图片上传、剪切功能
May 07 #PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 #PHP
PHP检测链接是否存在的代码实例分享
May 06 #PHP
一波PHP中cURL库的常见用法代码示例
May 06 #PHP
You might like
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
js实现简易计算器功能
2019/10/18 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
大学生违纪检讨书300字
2014/10/25 职场文书
员工工作心得体会
2019/05/07 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
Python实现照片卡通化
2021/12/06 Python
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang