很多phper一直停留在php web开发的mvc CURD中,也听到很多人对自己陷入这种困境中多有不满,但又不知道如何提高自己,摆脱困境。活脱脱就像一直趴在玻璃上的苍蝇,前途一片光明,就是飞不出去,可悲可叹。
话说回来,实际上做到一名合格的CURDer也并不是一件容易的事情,万万不可眼高手低。
如果想提高自己,也不一定非要通过工作,我认为一个人的提高更多是在非工作环境中。php的开发人员开始通过尝试接触并使用swoole或者workerman(0_0 或者等我的php socket框架,啦啦啦 0_0)来提高自己的认知水准,这就像2017年那部挺火的电视剧中那样,鼓励大家学英语,我认为挺好的。
学习swoole前,我建议大家有最好有如下知识储备或者有准备学习如下知识的准备:
  • 多进程多线程知识储备,多进程进程间通信,多进程多线程锁相关,进程管理等
  • 服务器IO模型相关知识储备
  • 熟练的*NIX系统操作以及良好的使用习惯
  • TCP协议以及socket相关知识储备
考虑到本PO主原来叨叨了一坨与进程相关的知识,所以这篇就来一坨与swoole进程相关的内容,这也是要学习并好好利用swoole的第一课,打好基础,会对你使用有着更大的帮助。
先贴一张图,是从官方wiki上偷过来的,不得不说,如果你去swoole官方wiki上找,都不一定能找到这个图,我的言下之意就是老韩写的文档组织方式以及内容确实比较混乱,没有对比就没有伤害,比如人家workerman的文档的,我贴出来,你们感受一下:
啦啦啦,盗图狗要贴图了:

5. swoole的进程模型 - 图1


5. swoole的进程模型 - 图2

结合上图开始简单描述一下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进程的人力资源保障部,负责他们的生死存亡和吃喝拉撒。