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 相关文章推荐
substr()函数中文版
Oct 09 PHP
php读取数据库信息的几种方法
May 24 PHP
PHP 函数语法介绍一
Jun 14 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
值得分享的php+ajax实时聊天室
Jul 20 PHP
php倒计时出现-0情况的解决方法
Jul 28 PHP
php封装一个异常的处理类
Jun 08 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 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
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
TensorFlow实现RNN循环神经网络
2018/02/28 Python
Python字符串对象实现原理详解
2019/07/01 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python实现人脸签到系统
2020/04/13 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
别名指示符是什么
2012/10/08 面试题
建筑自我鉴定
2013/10/19 职场文书
酒店管理求职信范文
2014/04/06 职场文书
Django操作cookie的实现
2021/05/26 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
Win11查看设备管理器
2022/04/19 数码科技