PHP 超高性能可扩展HTTP服务框架Webman

 更新时间:2024年02月05日 11:20:05   作者:开源技术小栈  
本文主要介绍了超高性能可扩展HTTP服务框架Webman,webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务,感兴趣的可以了解一下

webman是什么?

webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务。你可以用webman开发网站,也可以开发HTTP接口或者微服务。

除此之外,webman还支持自定义进程,可以做workerman能做的任何事情,例如websocket服务、物联网、游戏、TCP服务、UDP服务、unix socket服务等等。

webman理念

以最小内核提供最大的扩展性与最强的性能。

webman仅提供最核心的功能(路由、中间件、session、自定义进程接口)。其余功能全部复用composer生态,这意味着你可以在webman里使用最熟悉的功能组件,例如在数据库方面开发者可以选择使用Laravel的illuminate/database,也可以是ThinkPHP的ThinkORM,还可以是其它组件如Medoo。在webman里集成他们是非常容易的事情。

webman特点

1、高稳定性。webman基于workerman开发,workerman一直是业界bug极少的高稳定性socket框架。

2、超高性能。webman性能高于传统php-fpm框架10-100倍左右,比go的gin echo等框架性能高一倍左右。

3、高复用。无需修改,可以复用绝大部分composer组件及类库。

4、高扩展性。支持自定义进程,可以做workerman能做的任何事情。

5、超级简单易用,学习成本极低,代码书写与传统框架没有区别。

6、使用最为宽松友好的MIT开源协议。

webman性能

传统框架请求处理流程

  • nginx/apache接收请求

  • nginx/apache将请求传递给php-fpm

  • php-fpm初始化环境,如创建变量列表

  • php-fpm调用各个扩展/模块的RINIT

  • php-fpm磁盘读取php文件(使用opcache可避免)

  • php-fpm词法分析、语法分析、编译成opcode(使用opcache可避免)

  • php-fpm执行opcode 包括 8.9.10.11

  • 框架初始化,如实例化各种类,包括如容器、控制器、路由、中间件等。

  • 框架连接数据库并权限验证,连接redis

  • 框架执行业务逻辑

  • 框架关闭数据库、redis连接

  • php-fpm释放资源、销毁所有类定义、实例、销毁符号表等

  • php-fpm顺序调用各个扩展/模块的RSHUTDOWN方法

  • php-fpm将结果转发给nginx/apache

  • nginx/apache将结果返回给客户端

webman的请求处理流程

  • 框架接收请求

  • 框架执行业务逻辑

  • 框架将结果返回给客户端

注意:没错,在没有nginx反代的情况下,框架只有这3步。可以说这已经是php框架的极致,这使得webman性能是传统框架的几倍甚至数十倍。

传统的 FPM/Apache 的 PHP 应用性能无法与 Java、Golang 等应用抗衡, 主要有两点原因:

短生命周期,每次请求都会重复的初始化/销毁很多内存结构。

传统的 PHP 应用都是阻塞IO的,在高并发下大量的CPU浪费在进程上下文切换。

与go语言的web框架性能比对

带数据库查询业务,webman比同类型go语言的web框架性能高一倍左右。以上数据来自techempower.com

压力测试

压测结果受到哪些因素影响?

  • 压力机到服务器的网络延迟 (建议内网或本机压测)

  • 压力机到服务器的带宽 (建议内网或本机压测)

  • 是否开启HTTP keep-alive (建议开启)

  • 并发数是否足够 (外网压测要尽量开启更大的并发)

  • 服务端进程数是否合理 (helloworld业务进程数建议与cpu数相同,数据库业务进程数建议为cpu的四倍及以上)

  • 业务自身性能 (例如是否使用了外网数据库)

HTTP keep-alive是什么?

HTTP Keep-Alive机制是一种用于在单个TCP连接上发送多个HTTP请求和响应的技术,它对于性能测试结果影响很大,关闭keep-alive后QPS可能成倍下降。

目前浏览器都是默认开启keep-alive的,也就是浏览器访问某一个http地址后会将连接暂时保留不关闭,下一次请求时复用这个连接,用来提高性能。 压测时建议开启keep-alive。

压测时如何开启HTTP keep-alive?

如果是用的ab程序压测需要加-k参数,例如 ab -n100000 -c200 -k http://127.0.0.1:8787/。 apipost需要在返回头中返回gzip头才能开启keep-alive(apipost的bug,参考下面)。 其它压测程序一般会默认开启。

为什么通过外网压测QPS很低?

外网延迟很大导致QPS很低,是正常现象。例如压测baidu页面QPS可能只有几十。建议内网或者本机压测,排除网络延迟影响。如果一定要在外网压测,可以通过增加并发数来增加吞吐量(需保证带宽充足)。

为什么经过nginx代理后性能下降?

nginx运行需要消耗系统资源。同时,nginx和webman之间的通讯也需要消耗一定的资源。然而,系统的资源是有限的,webman无法获取到所有的系统资源,因此,整个系统的性能可能会有所下降是正常现象。

为了尽可能减少nginx代理带来的性能影响,可以考虑关闭nginx日志(access_log off;),开启nginx到webman之间的keep-alive,参考nginx代理。

另外https和http相比会损耗更多资源,因为https需要进行SSL/TLS握手,数据加密解密,包的尺寸变大占用更多带宽,这些会导致性能下降。

压测如果用的是短链接(不开启HTTP keep-alive),每次请求都需要额外的SSL/TLS握手通讯,性能会大幅降低。建议压测https开启HTTP keep-alive。

如何知道系统已经达到性能极限?

一般来说CPU达到100%时说明系统性能已经达到极限。如果CPU还有空闲说明还没达到极限,这时候可以适当增加并发提高QPS。

如果增加并发无法提高QPS则可能是webman进程数不够,请适当增加webman进程。如果仍然无法提高考虑带宽是否足够。

压测命令示例

ab

# 100000请求 200并发 开启keep-alive
ab -n100000 -c200 -k http://127.0.0.1:8787/

# 100000请求 200并发 未开启keep-alive
ab -n100000 -c200 http://127.0.0.1:8787/

wrk

# 200 并发压测10秒 开启keep-alive(默认)
wrk -c 200 -d 10s http://example.com

到此这篇关于PHP 超高性能可扩展HTTP服务框架Webman的文章就介绍到这了,更多相关Webman框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Zend Framework实现多文件上传功能实例

    Zend Framework实现多文件上传功能实例

    这篇文章主要介绍了Zend Framework实现多文件上传功能的方法,较为详细的分析说明了Zend Framework实现多文件上传的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-03-03
  • Laravel框架验证码类用法实例分析

    Laravel框架验证码类用法实例分析

    这篇文章主要介绍了Laravel框架验证码类用法,结合实例形式分析了Laravel框架验证码类的使用操作技巧与相关注意事项,需要的朋友可以参考下
    2019-09-09
  • php使用phpoffice/phpspreadsheet拓展操作excel实例

    php使用phpoffice/phpspreadsheet拓展操作excel实例

    这篇文章主要为大家介绍了php使用phpoffice/phpspreadsheet拓展操作excel实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • PHP统计二维数组元素个数的方法

    PHP统计二维数组元素个数的方法

    数据表里面的字段 content 存储了一个以逗号分割的字符串,最大有20个数,最大数字为40。比如3,24,33,40类似字样的数字序列。其实就是一个保存了多项投票结果的字段啦。现在需要统计每个数字的个数,也就是每个投票项有多少人投了,并排序
    2013-11-11
  • PDO实现学生管理系统

    PDO实现学生管理系统

    这篇文章主要为大家详细介绍了PDO实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Laravel手动返回错误码示例

    Laravel手动返回错误码示例

    今天小编就为大家分享一篇Laravel手动返回错误码示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • PHP设计模式(七)组合模式Composite实例详解【结构型】

    PHP设计模式(七)组合模式Composite实例详解【结构型】

    这篇文章主要介绍了PHP设计模式:组合模式Composite,结合实例形式详细分析了PHP组合模式Composite基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • Symfony数据校验方法实例分析

    Symfony数据校验方法实例分析

    这篇文章主要介绍了Symfony数据校验方法,实例分析了Symfony数据校验的常见技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解

    PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解

    本篇文章给大家介绍PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解,使用了微信官方给的php版本的sdk,但是在使用过程中有很多问题,今天给大家讲讲不集成支付SDK直接调用支付接口实现支付和退款,感兴趣的朋友一起看看吧
    2018-03-03
  • php之Aes加密案例讲解

    php之Aes加密案例讲解

    这篇文章主要介绍了php之Aes加密案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论