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代码优化及php相关问题总结
Oct 09 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
php设计模式 FlyWeight (享元模式)
Jun 26 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php判断表是否存在的方法
Jun 18 PHP
php多重接口的实现方法
Jun 20 PHP
PHP命名空间和自动加载类
Apr 03 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
php输出反斜杠的实例方法
Sep 19 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 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面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
python进阶教程之词典、字典、dict
2014/08/29 Python
Python实现二叉堆
2016/02/03 Python
使用Python设计一个代码统计工具
2018/04/04 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
django框架中间件原理与用法详解
2019/12/10 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
python主要用于哪些方向
2020/07/05 Python
python 代码运行时间获取方式详解
2020/09/18 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
九年级历史教学反思
2014/01/27 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
学术会议领导致辞
2015/07/29 职场文书
python 命令行传参方法总结
2021/05/25 Python
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS