概述
当谈到Web开发框架时,性能
和扩展
性是两个非常重要的方面。而今天我要向大家推荐的是超高性能的Webman框架。在这篇文章中,我将介绍一关于Webman框架的特点和优势,以便让大家了解为什么我如此推崇它。
unsetunsetOpenResty 和 Webmanunsetunset
OpenResty是一个基于Nginx的Web应用程序服务器,它使用Lua编程语言作为其扩展和脚本语言。 ——章亦春
Webman是一个基于Workerman的Web应用服务端框架,它使用PHP编程语言作为其扩展和脚本语言。 ——李亮
事件驱动
都采用了事件驱动的方式处理网络请求,通过IO多路复用技术实现高效的事件处理。
工作模式
都是master-worker模式,单 Master 多 Worker 的进程模型
- Master进程: 用于创建监听套接字、创建 Worker 进程及管理Worker进程,接收和处理来自客户端的连接请求,并将请求分发给Worker进程处理。
- Worker进程: 由 Master 进程通过 fork 系统调用派生出来的,所以会自动继承 Master 进程的监听套接字,每个 Worker 进程都可以独立地接收并处理来自客户端的连接。负责实际处理客户端的请求,包括解析HTTP请求、执行语言脚本、处理业务逻辑等。
图片来源:她和她的猫
unsetunset性能unsetunset
webman框架请求处理流程
代码语言:javascript复制 1. 框架接收请求
2. 框架执行业务逻辑
3. 框架将结果返回给客户端
传统FPM
框架请求处理流程
代码语言:javascript复制 1. nginx/apache接收请求
- 2. nginx/apache将请求传递给php-fpm
- 3. php-fpm初始化环境,如创建变量列表
- 4. php-fpm调用各个扩展/模块的RINIT
- 5. php-fpm磁盘读取php文件(使用opcache可避免)
- 6. php-fpm词法分析、语法分析、编译成opcode(使用opcache可避免)
- 7. php-fpm执行opcode 包括 `8.9.10.11`
- 8. 框架初始化,如实例化各种类,包括如容器、控制器、路由、中间件等。
- 9. 框架连接数据库并权限验证,连接redis
10. 框架执行业务逻辑
- 11. 框架关闭数据库、redis连接
- 12. php-fpm释放资源、销毁所有类定义、实例、销毁符号表等
- 13. php-fpm顺序调用各个扩展/模块的RSHUTDOWN方法
- 14. php-fpm将结果转发给nginx/apache
15. nginx/apache将结果返回给客户端
注意:没错,在没有nginx反代的情况下,框架只有这3步。可以说这已经是php框架的极致,这使得webman性能是传统框架的几倍甚至数十倍
unsetunset扩展unsetunset
webman仅提供最核心的功能(路由、中间件、session、自定义进程接口)
其余功能全部复用composer生态,这意味着你可以在webman里使用最熟悉的功能组件,例如在数据库方面开发者可以选择使用Laravel
的illuminate/database
,也可以是ThinkPHP
的ThinkORM
,还可以是其它组件如Medoo
。在webman里集成他们是非常容易的事情。
unsetunset生态unsetunset
webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务。你可以用webman开发网站,也可以开发HTTP接口或者微服务。
除此之外,webman还支持自定义进程,可以做workerman能做的任何事情,例如websocket服务、物联网、游戏、TCP服务、UDP服务、unix socket服务等等。
压测演习
unsetunset环境配置unsetunset
硬件
代码语言:javascript复制CPU:Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz 8 核心。内存:16GB。
操作系统
代码语言:javascript复制Linux iZbp1f9y8oinjct1ytiwulZ 4.15.0-137-generic #141-Ubuntu SMP Fri Feb 19 13:46:27 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
PHP版本
代码语言:javascript复制PHP 7.4.19
压测命令
代码语言:javascript复制ab -n 100000 -c 100 -k http://172.30.237.43:8901/
以上表示:请求总数10万、100并发、开启长链接
参数说明:
-n requests
要执行的请求总数-c concurrency
一次发出多个请求的数量。-k keepalive
使用HTTP Keepalive保持长连接功能。
压测框架
- 高性能PHP开发框架 webman。对应端口号:
8901
- 轻量级PHP开发框架ThinkPHP6。对应端口号:
8902
- 高性能Nginx lua框架OpenResty。对应端口号:
8903
unsetunset压测 Hello Worldunsetunset
压测报告
- webman
QPS: 126916.60 [#/sec]
- OpenResty
QPS: 120807.96 [#/sec]
- ThinkPHP6压测报告
QPS: 469.90 [#/sec]
webman框架
代码语言:javascript复制1、压测请求过程
$ ab -n 100000 -c 100 -k http://172.30.237.43:8901/f/v1/index/test
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.30.237.43 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software: workerman
Server Hostname: 172.30.237.43
Server Port: 8901
Document Path: /f/v1/index/test
Document Length: 12 bytes
Concurrency Level: 100
Time taken for tests: 0.788 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 13300000 bytes
HTML transferred: 1200000 bytes
Requests per second: 126916.60 [#/sec] (mean)
Time per request: 0.788 [ms] (mean)
Time per request: 0.008 [ms] (mean, across all concurrent requests)
Transfer rate: 16484.28 [Kbytes/sec] received
Connection Times (ms)
min mean[ /-sd] median max
Connect: 0 0 0.0 0 2
Processing: 0 1 0.3 1 13
Waiting: 0 1 0.3 1 13
Total: 0 1 0.3 1 15
Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 1
90% 1
95% 1
98% 1
99% 1
100% 15 (longest request)
Openresty框架
代码语言:javascript复制1、压测请求过程
$ ab -n 100000 -c 100 -k http://172.30.237.43:8903/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.30.237.43 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software: openresty
Server Hostname: 172.30.237.43
Server Port: 8903
Document Path: /
Document Length: 20 bytes
Concurrency Level: 100
Time taken for tests: 0.828 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 99044
Total transferred: 17895220 bytes
HTML transferred: 2000000 bytes
Requests per second: 120807.96 [#/sec] (mean)
Time per request: 0.828 [ms] (mean)
Time per request: 0.008 [ms] (mean, across all concurrent requests)
Transfer rate: 21112.16 [Kbytes/sec] received
Connection Times (ms)
min mean[ /-sd] median max
Connect: 0 0 0.1 0 2
Processing: 0 1 0.3 1 2
Waiting: 0 1 0.2 1 2
Total: 0 1 0.3 1 3
Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 1
90% 1
95% 1
98% 1
99% 2
100% 3 (longest request)
ThinkPHP6框架
代码语言:javascript复制1、压测请求过程
$ ab -n 100000 -c 100 -k http://172.30.237.43:8902/index/index
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.30.237.43 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software: openresty
Server Hostname: 172.30.237.43
Server Port: 8902
Document Path: /index/index
Document Length: 28367 bytes
Concurrency Level: 100
Time taken for tests: 212.810 seconds
Complete requests: 100000
Failed requests: 98943
(Connect: 0, Receive: 0, Length: 98943, Exceptions: 0)
Keep-Alive requests: 0
Total transferred: 2852228393 bytes
HTML transferred: 2836528393 bytes
Requests per second: 469.90 [#/sec] (mean)
Time per request: 212.810 [ms] (mean)
Time per request: 2.128 [ms] (mean, across all concurrent requests)
Transfer rate: 13088.59 [Kbytes/sec] received
Connection Times (ms)
min mean[ /-sd] median max
Connect: 0 0 0.1 0 10
Processing: 12 213 27.3 211 703
Waiting: 12 212 27.3 211 701
Total: 14 213 27.3 212 703
Percentage of the requests served within a certain time (ms)
50% 212
66% 220
75% 227
80% 231
90% 243
95% 254
98% 267
99% 281
100% 703 (longest request)
2、CPU和内存情况
unsetunset压测连接数据库
unsetunset
这里都是用ThinkORM。
压测报告
- webman
QPS: 17316.50 [#/sec]
- ThinkPHP6压测报告
QPS: 339.45 [#/sec]
webman框架
代码语言:javascript复制1、压测请求过程
$ ab -n 10000 -c 100 -k http://172.30.237.43:8901/f/v1/user/db
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.30.237.43 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: workerman
Server Hostname: 172.30.237.43
Server Port: 8901
Document Path: /f/v1/user/db
Document Length: 470 bytes
Concurrency Level: 100
Time taken for tests: 0.577 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 10000
Total transferred: 5990000 bytes
HTML transferred: 4700000 bytes
Requests per second: 17316.50 [#/sec] (mean)
Time per request: 5.775 [ms] (mean)
Time per request: 0.058 [ms] (mean, across all concurrent requests)
Transfer rate: 10129.47 [Kbytes/sec] received
Connection Times (ms)
min mean[ /-sd] median max
Connect: 0 0 0.1 0 2
Processing: 1 6 6.4 4 86
Waiting: 1 6 6.4 4 86
Total: 1 6 6.5 4 87
Percentage of the requests served within a certain time (ms)
50% 4
66% 5
75% 7
80% 8
90% 13
95% 18
98% 24
99% 31
100% 87 (longest request)
2、CPU和内存情况
注意:PHP进程内存
和CPU
消耗占比
ThinkPHP6框架
代码语言:javascript复制1、压测请求过程
$ ab -n 10000 -c 100 -k http://172.30.237.43:8902/index/db
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.30.237.43 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: openresty
Server Hostname: 172.30.237.43
Server Port: 8902
Document Path: /index/db
Document Length: 427 bytes
Concurrency Level: 100
Time taken for tests: 29.459 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 0
Total transferred: 5910000 bytes
HTML transferred: 4270000 bytes
Requests per second: 339.45 [#/sec] (mean)
Time per request: 294.595 [ms] (mean)
Time per request: 2.946 [ms] (mean, across all concurrent requests)
Transfer rate: 195.91 [Kbytes/sec] received
Connection Times (ms)
min mean[ /-sd] median max
Connect: 0 0 0.1 0 2
Processing: 17 293 34.5 287 505
Waiting: 17 293 34.5 287 505
Total: 19 294 34.5 287 506
Percentage of the requests served within a certain time (ms)
50% 287
66% 295
75% 301
80% 305
90% 327
95% 361
98% 405
99% 420
100% 506 (longest request
2、CPU和内存情况
注意:PHP进程内存
和CPU
消耗占比
性能对比
数据来自 techempower.com 第21轮压测(带数据库业务)
webman与go语言的web框架压测对比(带数据库业务)