2017 非标准 PHP 框架性能测试比较

2017-10-27 11:48:24 +08:00
 xujiajun

原文: https://xujiajun.cn/2017/10/27/php-framework-benchmark/

我最近在给tastphp 完善说明文档 有一节是性能测试比较 ,才有了下面这个项目,有什么说的不对的地方,大家给我指正。一起交流才有进步!

项目托管地址: https://github.com/xujiajun/php-framework-benchmark

针对 github 上比较活跃的几个开源项目,做了简单的比较。供大家参考:

php framework benchmark (include laravelsymfonysilexlumenslimyii2tastphp)

所有框架仅输出 "ok",就仅测试框架的本身的性能。如果有精力可以测下带有数据库交互的测试。

以下测试仅供参考,如果你想测的准,建议在生产环境测试!

测试的环境

OS Name:        Mac OS X
OS Version:     10.12.6
Architecture:   x86_64
CPU:Intel Core i7  1.7 GHz *2
RAM:8 GB
PHP version 7.1.10

各个框架的版本

Laravel version 5.5.0
Lumen version 5.5.0
symfony version 3.3.10
Silex version 2.0.2
Silm version 3.1.4
yii2 version 2.0.12
Tastphp version 1.3.6

测试结果

Detail

Laravel ab test

Laravel version 5.5.0

optimization

run commands before test:

composer install --optimize-autoloader
php artisan config:cache
// php artisan route:cache  //cannot use route caching if you have ANY route closures

ab test result:

➜  laravel-5.5.0 git:(master) ✗ ab -n 1000 -c 100 http://laravel-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking laravel-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        laravel-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   3.295 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      982346 bytes
HTML transferred:       2000 bytes
Requests per second:    303.46 [#/sec] (mean)
Time per request:       329.538 [ms] (mean)
Time per request:       3.295 [ms] (mean, across all concurrent requests)
Transfer rate:          291.11 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.8      0       8
Processing:    22  311  59.4    315     571
Waiting:       22  311  59.4    315     571
Total:         30  312  58.0    315     571

Percentage of the requests served within a certain time (ms)
  50%    315
  66%    335
  75%    351
  80%    354
  90%    362
  95%    367
  98%    378
  99%    407
 100%    571 (longest request)

Lumen version 5.5.0

run commands before test:

composer install --optimize-autoloader

ab test result:

➜  lumen-5.5.0 git:(master) ✗ ab -n 1000 -c 100 http://lumen-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking lumen-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        lumen-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   0.639 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      199000 bytes
HTML transferred:       2000 bytes
Requests per second:    1565.02 [#/sec] (mean)
Time per request:       63.897 [ms] (mean)
Time per request:       0.639 [ms] (mean, across all concurrent requests)
Transfer rate:          304.14 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.9      0       6
Processing:     9   61   9.9     62      74
Waiting:        9   61   9.9     62      74
Total:         14   61   9.1     62      74

Percentage of the requests served within a certain time (ms)
  50%     62
  66%     64
  75%     65
  80%     66
  90%     68
  95%     71
  98%     72
  99%     73
 100%     74 (longest request)

Symfony version 3.3.10

run commands before test:

composer install --optimize-autoloader

ab test result:

➜  symfony-3.3.10 git:(master) ✗ ab -n 1000 -c 100 http://symfony-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking symfony-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        symfony-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   1.716 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      237000 bytes
HTML transferred:       2000 bytes
Requests per second:    582.60 [#/sec] (mean)
Time per request:       171.646 [ms] (mean)
Time per request:       1.716 [ms] (mean, across all concurrent requests)
Transfer rate:          134.84 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.9      0       5
Processing:    12  163  34.6    168     218
Waiting:       12  163  34.6    168     218
Total:         17  163  33.9    169     218
WARNING: The median and mean for the initial connection time are not within a normal deviation
        These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
  50%    169
  66%    176
  75%    184
  80%    187
  90%    199
  95%    207
  98%    211
  99%    213
 100%    218 (longest request)

Silex version 2.0.2

run commands before test:

composer install --optimize-autoloader

ab test result:

➜  silex-2.0.2 git:(master) ✗ ab -n 1000 -c 100 http://silex-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking silex-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        silex-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   0.747 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      237000 bytes
HTML transferred:       2000 bytes
Requests per second:    1338.53 [#/sec] (mean)
Time per request:       74.709 [ms] (mean)
Time per request:       0.747 [ms] (mean, across all concurrent requests)
Transfer rate:          309.80 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.9      0       4
Processing:    15   71   9.3     73      88
Waiting:       15   71   9.3     73      88
Total:         20   72   8.6     73      89

Percentage of the requests served within a certain time (ms)
  50%     73
  66%     74
  75%     75
  80%     76
  90%     79
  95%     81
  98%     82
  99%     84
 100%     89 (longest request)

slim version 3.1.4

run commands before test:

composer install --optimize-autoloader

ab test:

➜  silm-3.1.4 git:(master) ✗ ab -n 1000 -c 100 http://slim-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking slim-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        slim-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   0.703 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      333000 bytes
HTML transferred:       2000 bytes
Requests per second:    1423.44 [#/sec] (mean)
Time per request:       70.252 [ms] (mean)
Time per request:       0.703 [ms] (mean, across all concurrent requests)
Transfer rate:          462.90 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.0      0       5
Processing:     7   67  15.7     65     210
Waiting:        7   66  15.7     65     210
Total:         12   67  15.1     66     210

Percentage of the requests served within a certain time (ms)
  50%     66
  66%     69
  75%     70
  80%     72
  90%     88
  95%     96
  98%    102
  99%    105
 100%    210 (longest request)

yii2 version 2.0.12

run commands before test:

composer install --optimize-autoloader

ab test result:

➜  yii2-2.0.12 git:(master) ✗ ab -n 1000 -c 100 http://yii2-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking yii2-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        yii2-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   0.649 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      165000 bytes
HTML transferred:       2000 bytes
Requests per second:    1539.74 [#/sec] (mean)
Time per request:       64.946 [ms] (mean)
Time per request:       0.649 [ms] (mean, across all concurrent requests)
Transfer rate:          248.10 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.0      0       5
Processing:    16   62   9.2     61      96
Waiting:       16   62   9.2     61      96
Total:         21   62   9.2     61      98

Percentage of the requests served within a certain time (ms)
  50%     61
  66%     64
  75%     67
  80%     69
  90%     73
  95%     77
  98%     89
  99%     94
 100%     98 (longest request)

Tastphp version 1.3.6

run commands before test:

composer install --optimize-autoloader
php bin/console cache:config
php bin/console cache:route

➜  tastphp-1.3.6 git:(master) mv config/example.app.yml config/app.yml
➜  tastphp-1.3.6 git:(master) cat config/app.yml
version: v1.3.6
debug: false
secret: tastphp
# dev | test | prod
env: prod
timezone: UTC
name: tastphp

ab test result:

➜  tastphp-1.3.6 git:(master) ✗ ab -n 1000 -c 100 http://tastphp-benchmark.dev/
This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tastphp-benchmark.dev (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.12.0
Server Hostname:        tastphp-benchmark.dev
Server Port:            80

Document Path:          /
Document Length:        2 bytes

Concurrency Level:      100
Time taken for tests:   0.487 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      165000 bytes
HTML transferred:       2000 bytes
Requests per second:    2051.92 [#/sec] (mean)
Time per request:       48.735 [ms] (mean)
Time per request:       0.487 [ms] (mean, across all concurrent requests)
Transfer rate:          330.63 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.8      0       4
Processing:     7   46   7.5     48      55
Waiting:        7   46   7.5     48      55
Total:         11   46   6.8     48      56

Percentage of the requests served within a certain time (ms)
  50%     48
  66%     49
  75%     50
  80%     51
  90%     52
  95%     53
  98%     54
  99%     55
 100%     56 (longest request)

广告时间

start 关注下:

最近也在编写以实际项目来说明 tastphp 的简单优雅好用

中文文档: https://github.com/tastphp/tastphp-docs/blob/master/zh/SUMMARY.md

欢迎 PR、issure 给我 你的 star,确实给我不小鼓励!让我坚持下去。祝国内产生更多优秀的开源产品!

8024 次点击
所在节点    PHP
33 条回复
sagaxu
2017-10-27 12:44:32 +08:00
https://github.com/xujiajun/php-framework-benchmark/blob/master/laravel-5.5.0/config/app.php

/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

用不到的可以注释掉
php01
2017-10-27 12:48:50 +08:00
如果只输出 ok 两个字,你可以用用 thinkphp3.2 版本。个人认为是秒杀上面一切框架。
iyaozhen
2017-10-27 12:58:36 +08:00
可以再加个原生的
k9982874
2017-10-27 13:00:16 +08:00
看到这个文章 就知道是来打 laravel 脸的
towser
2017-10-27 13:03:17 +08:00
光输出 ok 测试的主要是路由性能,应该通过依赖容器生成一些对象来测试容器性能。
sunmonster
2017-10-27 13:08:10 +08:00
php 除了本身框架之外,php-fpm 调优也很重要,像 slimphp,纯输出的话,我笔记本基本能到 3000,但是 3000 其实很低的,nodejs 都是 3,4 万的,swoole 能达到 12 万,查一条数据,swoole 能达到 6000,所以 php 里面除了 swoole 能用一下,其它框架没有啥用的理由了。有人说等你业务达到这个量再来讨论性能,那么我用一台机器能解决问题,为啥要用 10 台呢? laravel 在我的机子上勉强能上 500 的
Sor
2017-10-27 13:12:12 +08:00
thinkphp 呢?
killerv
2017-10-27 13:16:03 +08:00
想知道楼主有没有开 OpCache
49gd
2017-10-27 13:17:11 +08:00
那原生基本最猛了吧。
2ME
2017-10-27 13:26:52 +08:00
hello world 的测试在 V 站算月经贴了吧 看的有点够了 所以说一句自己的理解

感觉摩托艇和航母比速度没什么意义吧 各有各的用处 追求速度直接怼原生就好了

新手勿喷(逃
xujiajun
2017-10-27 13:54:42 +08:00
@killerv 开了
xujiajun
2017-10-27 13:55:04 +08:00
@Sor 没测 你有兴趣给我提交 PR
xujiajun
2017-10-27 13:55:53 +08:00
@49gd 原生 无框架 当然是最快的。但是谁会用无框架开发呢?
HowToMakeLove
2017-10-27 13:58:06 +08:00
PHP 前期还是要看开发速度的吧
xujiajun
2017-10-27 14:13:11 +08:00
@sunmonster 你好 在我看来 php 之所以流行就是因为她的简单。框架的意义是性能和开发效率的权衡。还有考虑团队的学习成本。swoole 虽然性能高,但是学习成本在那里(各种系统编程的知识) 。试问有多少 phper hold 得住一个 core dump。对于专注业务开发的同学 其实同样时间 可能学习 Go、java 等不是更值得。于其说学 swoole,其实就是学 c/c++ 和 zend api 扩展开发。。

另外 tastphp 也有 swoole 分支: https://github.com/tastphp/tastphp-swoole 可以关注下。
loveCoding
2017-10-27 14:21:06 +08:00
输出字节大小 1k,5k,10k....100k , 这样测试吧
sunmonster
2017-10-27 15:00:02 +08:00
@xujiajun 不是在于简单,是在于*生态**,swoole 的话可以利用 php 原有的生态,这是 GO 还比不了的,C,C++更别提了,这方面 nodejs 也有优势,所以做 web 业务首选 php,nodejs,而 nodejs 不需要特别的优化就有不错的性能,当然这里排除了团队的因素。swoole 不是很难吧,只是用的话根本不需要了解 zendapi 扩展开发,swoole 加上 Eloquent ORM 还是很不错的


@loveCoding 一看就知道从来没做过测试吧,对于 qps 的量应该也没什么概念吧,无脑吐槽只会暴露自己的无知而已
HYSS
2017-10-27 15:18:29 +08:00
<?php
echo "hello,world!";
?>

秒杀一切
linpf
2017-10-27 15:29:55 +08:00
@sunmonster 开发效率也是成本。PHP 开发主流类型网站,效率比其他语言会更高,同样开发周期,可以少雇几个程序员。程序员一个月工资得多少钱,服务器一个月才几个钱。
WuwuGin
2017-10-27 15:45:09 +08:00
@sunmonster swoole 确实厉害,但是一般 phper 不会在乎的,并且知识面也达不到。有需求就会有这些 PHP framework 的存在。这其实就是为什么 PHP 一种被黑的原因,入门门槛低。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX