网上充斥着各式各样的 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.interned
stringsbuffer=64 
opcache.max
acceleratedfiles=20000 
opcache.validate
timestamps=0 
opcache.savecomments=1 
opcache.fast
shutdown=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 来一场公平的性能测试的更多相关文章

  1. Laravel Study(使用 Laravel )

    開始 伺服器及相關工具安裝自行建立,在伺服器跟目錄下 有兩種方式建立 Laravel 專案,這裡使用 composer 建立專案 使用 composer 要在 PHP 5.3.2 以上才能使用 com ...

  2. laravel框架——composer导入laravel

    第一种: composer create-project --prefer-dist laravel/laravel 名称 "5.2.*"第二种: composer global ...

  3. laravel ajax提交报错Symfony\Component\HttpKernel\Exception\HttpException

    出现此种错误,通常是没有提交安全验证 params = { id: 2, _token: '{{ csrf_token() }}' } function cancel() { var url = &q ...

  4. Laravel源码分析--Laravel生命周期详解

    一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...

  5. Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...

  6. [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 ...

  7. laravel new xxx 安装laravel 慢的问题

    问题:使用官方文档上安装 laravel laravel new xxx 安装速度奇慢无比,设置了composer 全局镜像也没有用 composer config -g repo.packagist ...

  8. 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出  ...

  9. laravel(一):如何安装laravel

    1.前提条件 本文针对想从零开始开发 Laravel 程序的初学者,不需要预先具备任何的 Laravel 使用经验.不过,为了能顺利阅读,还是需要事先安装好一些软件: PHP 5.4 及以上版本 包管 ...

随机推荐

  1. 装饰器--decorator2

    装饰器加参数 import time def timer(func): # timer(test2) func = test2 def deco(): start_time = time.time() ...

  2. 跟我一起写Makefile(五)

    使用变量———— 在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方.其与C/C++所不同的是, ...

  3. redis-cluster 集群搭建详细指南及常见问题集合

    只当个搬运工吧 搭建篇:https://www.cnblogs.com/mafly/p/redis_cluster.html  测试能用 常见问题: 1 redis操作key时出现以下错误 (erro ...

  4. java绝对路径和相对路径的理解

    日常开发中引用东西经常会遇到路径问题,各种尝试,各种出错,其实只要理解了这两种路径,问题便迎刃而解. 在java中路径有两种表示方法:绝对路径和相对路径. (1) 相对路径:它以不带“\”的目录名表示 ...

  5. 【leetcode 简单】第十三题 最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...

  6. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  7. 天梯赛 L1-009 N个数求和 (模拟)

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=1 ...

  8. Redis笔记之常用命令

    keys keys用来获取符合指定规则的键,keys的语法规则如下: keys <pattern> 比如最简单的全等匹配,下面这个命令只会匹配键值完全等于foo的: 127.0.0.1:6 ...

  9. RMQ之ST求区间最大值

    题目链接:https://cn.vjudge.net/problem/HRBUST-1188 每一次按照二进制的方式进行更新,二维数组dp [i] [j],i表示下标,j表示从i 开始的往后移动2的j ...

  10. Mysql储存过程2:变量定义与参数传递

    #储存过程 中的变量定义 declare 变量名 类型 可选类型 -- 跟建表差不多 create procedure p() begin ); ; select age+number; end$ / ...