Laravel 之父:让 Laravel、Symfony、 Zend 来一场公平的性能测试
网上充斥着各式各样的 PHP 框架性能对比的文章。然而,他们总是把“苹果”和“橘子”做对比(看上去有点儿像,都是圆的,但其实不是一码事)。这次,我将着重对 Laravel、Symfony 和 Zend 这三个框架做性能对比,并且还要说明为什么这三个框架总是被错误的进行比较。
我给的对比结果你不必全信。读完这篇文章之后,你可以自己搞一个 2GB 的 DigitalOcean 的服务器亲自去检验一下,也就 5 分钟而已。
开始之前,我希望你知道:所有这些框架都足够快,都可以满足你构建任何应用。写这篇文章之前我也犹豫过,我认为做这种层次的对比其实真的挺傻的。我唯一的目的是展示如何在三个框架之间进行公平的比较。
问题的源头
当你在一台全新的 DigitalOcean 服务器上配置 Symfony 或 Zend 项目时,你会发现返回的 http 响应是没有 session 信息的。注意,看下图,cookie 并没有被返回:

然而,Laravel 默认是开启 session 的(另外还有一些中间件)。这样能让基于 Laravel 构建的应用很方便地利用 session 机制将用户状态持久化保存。为了 Laravel 框架的用户更方便而默认开启 session 反倒让 Laravel 在性能对比中很受伤。

另一个常见错误是:要么没有倒出一份优化过的 Composer autoloader ;要么没有用 php artisan config:cache 指令缓存 Laravel 配置信息 -- 这份缓存能够大幅度减少 Laravel 的启动(bootstrap)时间。
设置环境
首先,我通过 Laravel Forge 在 DiginalOcean 上创建了一个 2GB 内存的服务器,安装的是 PHP 7.1 版本。然后安装 Symfony ,优化 Composer autoloader ,配置 Nginx 通过生产环境下的前端控制器(app.php)运行。并且我还按照 Symfony 生产环境调优指南一步步设置到位。对于 Zend 的配置也类似。
接下来,针对 PHP 7.1 的 opcache 设置如下(生产环境):
opcache.enable=1
opcache.memoryconsumption=512
opcache.internedstringsbuffer=64
opcache.maxacceleratedfiles=20000
opcache.validatetimestamps=0
opcache.savecomments=1
opcache.fastshutdown=1
安装 Laravel 时,执行 config:cache Artisan 指令,并且在 app/Http/Kernel.php文件中将 web 中间件组注释掉(这些中间件的作用就是让 Laravel 支持 session)。做完上述修改之后就可以让三个框架都在无 session 支持的状态下进行对比了。
对比结果
After configuring the projects, I ran a simple test using Apache benchmark, which anyone can recreate:
三个框架都能正常运行后,终于可以祭出 Apache benchmark 来做简单的测试了。其实任何人都可以很容易地复现这一测试:
ab -t 10 -c 10 [http://server.address/]
下面是测试结果:
无 Session:
- Laravel: 609.03 次请求/秒 (平均值)
- Zend: 559.91 次请求/秒 (平均值)
- Symfony: 532.97 次请求/秒 (平均值)
有 Session:
- Laravel: 521.64 次请求/秒(平均值)
- Zend: 484.94 次请求/秒 (平均值)
- Symfony: 439.37 次请求/秒 (平均值)
原文地址:https://medium.com/@taylorotwell/benchmarking-laravel-symfony-zend-2c01c2b270f8#.kf4gywdmg
Laravel 之父:让 Laravel、Symfony、 Zend 来一场公平的性能测试的更多相关文章
- Laravel Study(使用 Laravel )
開始 伺服器及相關工具安裝自行建立,在伺服器跟目錄下 有兩種方式建立 Laravel 專案,這裡使用 composer 建立專案 使用 composer 要在 PHP 5.3.2 以上才能使用 com ...
- laravel框架——composer导入laravel
第一种: composer create-project --prefer-dist laravel/laravel 名称 "5.2.*"第二种: composer global ...
- laravel ajax提交报错Symfony\Component\HttpKernel\Exception\HttpException
出现此种错误,通常是没有提交安全验证 params = { id: 2, _token: '{{ csrf_token() }}' } function cancel() { var url = &q ...
- Laravel源码分析--Laravel生命周期详解
一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...
- Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...
- [Laravel] 14 - REST API: Laravel from scratch
前言 一.基础 Ref: Build a REST API with Laravel API resources Goto: [Node.js] 08 - Web Server and REST AP ...
- laravel new xxx 安装laravel 慢的问题
问题:使用官方文档上安装 laravel laravel new xxx 安装速度奇慢无比,设置了composer 全局镜像也没有用 composer config -g repo.packagist ...
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出 ...
- laravel(一):如何安装laravel
1.前提条件 本文针对想从零开始开发 Laravel 程序的初学者,不需要预先具备任何的 Laravel 使用经验.不过,为了能顺利阅读,还是需要事先安装好一些软件: PHP 5.4 及以上版本 包管 ...
随机推荐
- 第5章-Vue.js交互及生命周期练习
一.学习目标 使用网络请求进行前后端交互 (重点) 理解钩子函数的作用 (难点) 掌握Vue.js过滤器的使用方法 了解Vue.js事件的深入用法 (重点) 二.仿写留言板 2.1.实现" ...
- 前端PHP入门-033-连接数据库-天龙八步
php检查MySQL的支持是否开启? 若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可! 注意: 从PHP7开始默认不再支持mysql ...
- Java 8 Stream 用法
一.Stream是什么 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元 ...
- Eclipse 使用mybatis generator插件自动生成代码
Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...
- codeforces 876 D. Sorting the Coins
http://codeforces.com/contest/876/problem/D D. Sorting the Coins time limit per test 1 second memory ...
- java中error和exception
异常是指程序运行时发生的错误. Throwable是所有异常的父类,它有两个子类:Error和Exception. 1.Error表示程序在运行期间发生了非常严重的错误,并且该错误是不可恢复的.Err ...
- IDEA常见错误
1. inspects a maven model for resolution problems 在添加Maven依赖的时候,报了inspects a maven model for resolut ...
- html5手机Web单页应用实践--起点移动阅读
一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读.而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发 ...
- Tinyos 第三版Make系统
1.make系统安装 cd tools ./Bootstrap ./configure make sudo make install 2.make系统结构 3.第三版Makerules文件部分解析 # ...
- keypress 、keydown、keyup后触发回车
1.keypress .keydown.keyup的区别 keypress表示键盘按下的全过程,只有按下任意字母数字键(后退.删除等系统功能键无效)时才触发,捕获到的keyCode区分大小写 keyd ...