为了账号安全,请及时绑定邮箱和手机立即绑定

压测 php 框架

标签:
PHP

最近一个项目因为性能原因(原项目使用 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\qpsab/helloab/dbab/redis
hyper-api133.2925.0689.13
ci115.4723.6645.03
lumen67.5218.1536.39

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

3 个测试项目的代码:

压测 case

  • ab/hello: 3 个框架均返回 json 数据: {"code":"0000","msg":"success"}

  • ab/db: 3 个框架均使用 model 并返回 10 条 users 表数据

1   牟萍  dolorem_qui@example.net $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    hLSviARL7f  2017-08-20 18:14:22 2017-08-20 18:14:222   丘智敏 vcum@example.com    $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    JTg0zvrG5S  2017-08-20 18:14:22 2017-08-20 18:14:223   胥斌  in.nostrum@example.org  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    FRekYNw2NA  2017-08-20 18:14:22 2017-08-20 18:14:224   唐秀云 vnatus@example.com  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    oOxO2oRneR  2017-08-20 18:14:22 2017-08-20 18:14:225   罗海燕 tqui@example.net    $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    0FPqnEbWlt  2017-08-20 18:14:22 2017-08-20 18:14:226   卜欢  aut.labore@example.net  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    ZaqOYvfq7q  2017-08-20 18:14:22 2017-08-20 18:14:227   白欣  optio_nesciunt@example.net  $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    aIU2QRm6kJ  2017-08-20 18:14:22 2017-08-20 18:14:228   甘鹰  natus07@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    azP1OW5QKW  2017-08-20 18:14:22 2017-08-20 18:14:229   欧东  excepturi.nulla@example.com $2y$10$MLYoIDH0DHwzpnLlVkIV0u/NoWcio1cta2Q4xtdAXFf8HR1fvAMwe    Yg8tJhNvDN  2017-08-20 18:14:22 2017-08-20 18:14:2210  原晨  ipsa.quis@example.net   $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\":\"dolorem_qui@example.net\",\"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/helloDocument Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100Time taken for tests:   86.604 seconds
Complete requests:      10000Failed requests:        0Total 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/helloDocument Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100Time taken for tests:   148.115 seconds
Complete requests:      10000Failed requests:        0Total 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/helloDocument Path:          /ab/hello
Document Length:        31 bytes

Concurrency Level:      100Time taken for tests:   75.025 seconds
Complete requests:      10000Failed requests:        0Total 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/dbDocument Path:          /ab/db
Document Length:        2351 bytes

Concurrency Level:      100Time taken for tests:   4.226 seconds
Complete requests:      100Failed requests:        0Total 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/dbDocument Path:          /ab/db
Document Length:        2400 bytes

Concurrency Level:      100Time taken for tests:   5.510 seconds
Complete requests:      100Failed requests:        0Total 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/dbDocument Path:          /ab/db
Document Length:        2321 bytes

Concurrency Level:      100Time taken for tests:   3.991 seconds
Complete requests:      100Failed requests:        0Total 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/redisDocument Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100Time taken for tests:   22.205 seconds
Complete requests:      1000Failed requests:        0Keep-Alive requests:    0Total 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/redisDocument Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100Time taken for tests:   11.220 seconds
Complete requests:      1000Failed requests:        0Keep-Alive requests:    0Total 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/redisDocument Path:          /ab/redis
Document Length:        239 bytes

Concurrency Level:      100Time taken for tests:   27.479 seconds
Complete requests:      1000Failed requests:        0Keep-Alive requests:    0Total 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 个亿够不够

  • 什么时候该考虑性能, 至少要业务能有量才行



作者:daydaygo
链接:https://www.jianshu.com/p/2b549ca452cf

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消