压测 php 框架

title: 压测 php 框架
date: 2017-8-20 21:28:57

最近一个项目因为性能原因(原项目使用 nodejs, 单项目中同时提供 http tcp websocket 服务)需要重构, 短连接(http api) 准备用 php(开发速度快, 所以 xxx 是世界上最好的语言) 重写.

下面对 ci / lumen / hyper-api 3 个框架进行压测, 来选择这次重写需要使用的框架.

关于 压测, 参考 rango 的博客: http://rango.swoole.com/archives/254

压测结果

qps: query per second, 查看服务器性能最直观的指标
关于 qps 低: 服务器基础服务是最低配的 阿里云 ecs + docker

php\qps ab/hello ab/db ab/redis
hyper-api 133.29 25.06 89.13
ci 115.47 23.66 45.03
lumen 67.52 18.15 36.39

不得不说, hyper-api 的表现非常亮眼, 欢迎大家尝试

3 个测试项目的代码:

  • hayper-api: https://coding.net/u/daydaygo/p/hyper-api/git
  • ci: https://coding.net/u/daydaygo/p/ci/git
  • lumen: https://coding.net/u/daydaygo/p/lumen/git

压测 case

  • ab/hello: 3 个框架均返回 json 数据: {"code":"0000","msg":"success"}
  • ab/db: 3 个框架均使用 model 并返回 10 条 users 表数据
1   牟萍  [email protected] $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    hLSviARL7f  2017-08-20 18:14:22 2017-08-20 18:14:22
2   丘智敏 [email protected]    $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    JTg0zvrG5S  2017-08-20 18:14:22 2017-08-20 18:14:22
3   胥斌  [email protected]  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    FRekYNw2NA  2017-08-20 18:14:22 2017-08-20 18:14:22
4   唐秀云 [email protected]  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    oOxO2oRneR  2017-08-20 18:14:22 2017-08-20 18:14:22
5   罗海燕 [email protected]    $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    0FPqnEbWlt  2017-08-20 18:14:22 2017-08-20 18:14:22
6   卜欢  [email protected]  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    ZaqOYvfq7q  2017-08-20 18:14:22 2017-08-20 18:14:22
7   白欣  [email protected]  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    aIU2QRm6kJ  2017-08-20 18:14:22 2017-08-20 18:14:22
8   甘鹰  [email protected] $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    azP1OW5QKW  2017-08-20 18:14:22 2017-08-20 18:14:22
9   欧东  [email protected] $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    Yg8tJhNvDN  2017-08-20 18:14:22 2017-08-20 18:14:22
10  原晨  [email protected]   $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    Xa91IMhTfu  2017-08-20 18:14:22 2017-08-20 18:14:22
  • db/redis: 3 个框架均访问 redis 获取 1 条存储的 user 数据
127.0.0.1:6379> get ab-test

"{\"id\":1,\"name\":\"\\u725f\\u840d\",\"email\":\"[email protected]\",\"password\":\"$2y$10$MLYoIDH0DHwzpnLlVkIV0u\\/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe\",\"remember_token\":\"hLSviARL7f\",\"created_at\":\"2017-08-20 18:14:22\",\"updated_at\":\"2017-08-20 18:14:22\"}"

压测数据

在压测 db 的时候, 一直报 apr_pollset_poll: The timeout specified has expired (70007), 所以只发起了 100 的访问

  • ci - ab/hello
ab -c 100 -n 10000 http://ci.daydaygo.top/ab/hello

Document Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100
Time taken for tests:   86.604 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1860000 bytes
HTML transferred:       310000 bytes
Requests per second:    115.47 [#/sec] (mean)
Time per request:       866.044 [ms] (mean)
Time per request:       8.660 [ms] (mean, across all concurrent requests)
Transfer rate:          20.97 [Kbytes/sec] received
  • lumen ab/hello
ab -c 100 -n 10000 http://lumen.daydaygo.top/ab/hello

Document Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100
Time taken for tests:   148.115 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2120000 bytes
HTML transferred:       310000 bytes
Requests per second:    67.52 [#/sec] (mean)
Time per request:       1481.150 [ms] (mean)
Time per request:       14.811 [ms] (mean, across all concurrent requests)
Transfer rate:          13.98 [Kbytes/sec] received
  • hyper-api ab/hello
ab -c 100 -n 10000 http://hyper.daydaygo.top/ab/hello

Document Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100
Time taken for tests:   75.025 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2520000 bytes
HTML transferred:       310000 bytes
Requests per second:    133.29 [#/sec] (mean)
Time per request:       750.254 [ms] (mean)
Time per request:       7.503 [ms] (mean, across all concurrent requests)
Transfer rate:          32.80 [Kbytes/sec] received
  • ci ab/db
ab -c 100 -n 400 -k http://ci.daydaygo.top/ab/db

Document Path:          /ab/db
Document Length:        2351 bytes

Concurrency Level:      100
Time taken for tests:   4.226 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      250600 bytes
HTML transferred:       235100 bytes
Requests per second:    23.66 [#/sec] (mean)
Time per request:       4226.170 [ms] (mean)
Time per request:       42.262 [ms] (mean, across all concurrent requests)
Transfer rate:          57.91 [Kbytes/sec] received
  • lumen ab/db
ab -c 100 -n 100 -k http://lumen.daydaygo.top/ab/db

Document Path:          /ab/db
Document Length:        2400 bytes

Concurrency Level:      100
Time taken for tests:   5.510 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      258100 bytes
HTML transferred:       240000 bytes
Requests per second:    18.15 [#/sec] (mean)
Time per request:       5509.861 [ms] (mean)
Time per request:       55.099 [ms] (mean, across all concurrent requests)
Transfer rate:          45.75 [Kbytes/sec] received
  • hyper ab/db
ab -c 100 -n 100 -k http://hyper.daydaygo.top/ab/db

Document Path:          /ab/db
Document Length:        2321 bytes

Concurrency Level:      100
Time taken for tests:   3.991 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      254200 bytes
HTML transferred:       232100 bytes
Requests per second:    25.06 [#/sec] (mean)
Time per request:       3991.113 [ms] (mean)
Time per request:       39.911 [ms] (mean, across all concurrent requests)
Transfer rate:          62.20 [Kbytes/sec] received
  • ci ab/redis
ab -c 100 -n 1000 -k http://ci.daydaygo.top/ab/redis

Document Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100
Time taken for tests:   22.205 seconds
Complete requests:      1000
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      394000 bytes
HTML transferred:       239000 bytes
Requests per second:    45.03 [#/sec] (mean)
Time per request:       2220.522 [ms] (mean)
Time per request:       22.205 [ms] (mean, across all concurrent requests)
Transfer rate:          17.33 [Kbytes/sec] received
  • hyper ab/redis
ab -c 100 -n 1000 -k http://hyper.daydaygo.top/ab/redis

Document Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100
Time taken for tests:   11.220 seconds
Complete requests:      1000
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      468000 bytes
HTML transferred:       239000 bytes
Requests per second:    89.13 [#/sec] (mean)
Time per request:       1121.954 [ms] (mean)
Time per request:       11.220 [ms] (mean, across all concurrent requests)
Transfer rate:          40.74 [Kbytes/sec] received
  • lumen ab/redis
ab -c 100 -n 1000 -k http://lumen.daydaygo.top/ab/redis

Document Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100
Time taken for tests:   27.479 seconds
Complete requests:      1000
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      420000 bytes
HTML transferred:       239000 bytes
Requests per second:    36.39 [#/sec] (mean)
Time per request:       2747.931 [ms] (mean)
Time per request:       27.479 [ms] (mean, across all concurrent requests)
Transfer rate:          14.93 [Kbytes/sec] received

后记

因为 3 个框架都不算特别熟悉, 在写压测 case 时, 基本是照着文档来实现的, 所以, 尽管 还有很大的优化的空间, 但是这个时候我的选择倾向于 hyper-api.

关于性能, 也有几点认识:

  • 性能优化是没有止境的
  • 要多好的性能才够, 1 个亿够不够
  • 什么时候该考虑性能, 至少要业务能有量才行

你可能感兴趣的:(压测 php 框架)