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 相关文章推荐
屏蔽浏览器缓存另类方法
Oct 09 PHP
PHP 数组入门教程小结
May 20 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
一文搞懂PHP中的抽象类和接口
May 25 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读取msn上的用户信息类
2008/12/05 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
php7 新增功能实例总结
2020/05/25 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
Python判断变量是否已经定义的方法
2014/08/18 Python
python实现基本进制转换的方法
2015/07/11 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python实现扫雷游戏
2020/03/03 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
某某同志考察材料
2014/05/28 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
教师聘用意向书
2015/05/11 职场文书
中学音乐课教学反思
2016/02/18 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python