swoole和workerman究竟分别是什么?

众所周知,php是单进程的脚本运行模式。当然,php-fpm是多进程的,不过这个多进程,并不支持多并发。当并发高起来,多进程就显得那么的“菜鸡”。cpu的调用就会混乱不看,性能极差。(php-fpm(点击查看))

如果想在代码里,多进程开发怎么办呢?假设有这么一个需求:

查询多个数据库里订单表里的10w条数据,并且根据里面的手机号去请求接口获取归属地,最后按照归属地出一个报表统计。

传统的方式,就是查询到后,循环遍历,一个个去请求接口,最后把数据整合在一起,存起来。那么,超时就是必然的了,百分之百执行不下去。或者是分割数据,再处理,那样又会耗时更多。

最佳的方案,其实很多种。比如,使用消息队列,切分请求,最后数据合并即可。这里讲的,是今天的主角,那就是多进程开发


 

php最强大的是函数,其实有很多可以支持多进程的函数的。如proc_open。但是,这方面不是他的强项,问题很多,官方也没有在这里发力。但是,事情总得处理,市场就出现了很多解决方案。其中最火的就是swoole和workerman。

终于说到今天的主角了,那么他们分别是是什么呢?

引用官网的描述:

Swoole 是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程高性能网络编程支持。提供了多种通信协议的网络服务器和客户端模块,可以方便快速的实现 TCP/UDP服务高性能WebWebSocket服务物联网实时通讯游戏微服务等,使 PHP 不再局限于传统的 Web 领域。

 

Workerman是一款纯PHP开发的开源高性能的PHP 应用容器。Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。

 

说人话,其实就是:1、swoole是使用C语言实现的socket通信框架,而workerman是使用纯php实现的socket框架;2、workerman中socket是由worker进程负责的,swoole则是由主进程中的reactor线程来负责的。

swoole:

master进程

这个进程比较复杂,也是我认为最核心的进程,这是一个包含多线程的进程,分别是一个主线程和n个reactor线程(数量可以配置)。

其中,主线程用于accept新的连接,然后评估一下每个reactor线程负责维护的连接数,然后分配给数量最少的那个reactor线程,最大程度保证每个reactor线程的负载量是均衡的。

本质上讲,一旦一个socket可读或者可写了,就由reactor线程发送给worker进程或者发送会客户端。除此之外,主线程还负责对所有信号的接管,避免reactor线程收到信号的打扰中断。

说的洋气点儿就是:master进程负责了连接的accept、托管、socket的可读可写(数据的发送和接受),本质上讲,master进程负责了IO。还需要注意一点儿的是reactor线程是彻底的全异步非阻塞工作方式。

manager进程

manager进程是worker进程和taskworker进程的妈,说的洋气点儿就是manager进程fork出来了worker进程和taskworker进程,生出来了就得管,所以,manager进程得负责对worker进程和taskworker进程的抚养义务,具体包括监控它们的状态、当它们意外挂了后重新拉起一个新的进程(避免了僵尸进程)、平滑重启(就是传说中的reload)。

worker进程

worker进程是manager进程fork出来的,这个进程说白了就是搬砖干活(官方文档中屡次提到的业务代码),其实就是平时码的那些curd业务逻辑代码,懂了吧?只不过worker进程比较diao的是,这个进程可以用异步方式去工作,也可以用同步方式去工作。如果听不懂什么意思,那就先背过,先混个脸熟再说。

taskworker进程

taskworker进程(后文中称tasker进程)实际本质上也是worker进程,只不过是一种特殊的worker进程。如果你的worker进程中存在一些耗时耗力的操作,那么可以先抛给tasker进程,自己先去干别的,等tasker干完了,再由worker进程取回,非常diao。但是tasker进程只能工作在同步方式下,并不能使用异步。这就是为什么tasker进程不可以使用定时器,而worker进程可以使用定时器的原因。

简单总结混在一起说下这几种进程之间是怎么搭配起来干活的。见说来说,就是master进程就是接活儿的销售,但是具体干活则由worker进程来做,如果worker进程感觉到某些流程太繁忙复杂就可以让tasker进程来做。而manager进程就是后勤worker进程和takser进程的人力资源保障部,负责他们的生死存亡和吃喝拉撒。

 


workerman

而workerman的进程模型相对就要简单很多了,首先相对于swoole来说,workerman没有swoole中的reator线程,其次workerman没有用于处理普通业务的worker进程以及tasker进程。而workerman的话,socket是由worker进程负责的,swoole中则是由主进程中的reactor线程来负责的。而swoole在接受到数据后,可以通过自己的worker进程来处理业务(有点儿类似于fpm进程)。

workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。

workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。

 

其实,不管是swoole还是workerman,都是对接网络层的socket编程,如果想要彻底了解清楚,还是得去学习linux网络编程,了解系统层面的多进程是如何运转的。因为不管是任何语言,最后都是请求到了系统层面的进程。北风大佬的理解真的深刻,让我受益良多。所有的编程语言它们都是调用共同的系统调用API ,应用层的拔高点,必然是网络层。网络层再继续,就是硬件通信了。学习永无止境,朋友,加油吧!!!

posted @ 2023-08-01 11:27  知风阁  阅读(85)  评论(0编辑  收藏  举报