一、进程基础知识什么是进程?所谓进程,其实就是操作系统中运行的程序。我们在终端中通过php运行一个php文件,相当于创建了一个进程,该进程会驻留在系统中,申请自己的内存空间系统资源,并运行相应的程序。对于一个进程来说,它的核心内容分为两部分,一个是它的内存,一个是它的内存。内存是在创建进程时由系统分配的,它创建的所有变量都会存放在这个内存环境中。一是它的上下文环境。我们知道进程是运行在操作系统上的,那么对于程序来说,它的运行取决于操作系统分配给它的资源,操作系统的一些状态。操作系统中可以运行多个进程。对于一个进程,它可以创建自己的子进程。那么当我们在一个进程中创建几个子进程时,可以看到图片,子进程和父进程一样,都有自己的内存空间和上下文。2.Swoole进程结构Swoole的高效不仅仅是底层用C写的,它的进程结构模型也让它能够高效的处理业务。我们要深入学习,在实践中需要了解场景中的使用。先来看一下结构图:首先介绍一下swoole的这些进程是干什么的:从这几个层级的名字来看,下面的层级是做什么用的。做详细说明。Master进程:主进程Manger进程:管理进程Worker进程:工作进程Task进程:异步任务工作进程1、第一层Master进程,Master进程,这个是swoole的主进程,这个进程用来处理核心swooleDriven的events,那么在这个过程中,可以看到它有一个MainReactor[thread]和几个Reactor[threads]。所有swoole对事件的监听都会在这些线程中实现,比如来自客户端的连接,信号处理等,每个线程都有自己的目的。下面每个线程都有对MainReactor(主线程)的理解。主线程将负责监听服务器套接字。如果有新的连接accept,主线程会评估每个Reactor线程的连接数。将此连接分配给连接数最少的反应器线程以进行负载平衡。Reactor线程组Reactor线程负责维护客户端机器的TCP连接,处理网络IO,以完全异步和非阻塞的方式发送和接收数据。swoole主线程接受新连接后,会将连接分配给固定的Reactor线程,在socket可读时读取数据,进行协议解析,将请求投递给Worker进程。当套接字可写时向TCP客户端发送数据。心跳包检测线程(HeartbeatCheck)Swoole配置心跳检测后,心跳包线程会在固定时间内向所有之前在线的连接发送检测包UDP包接收线程(UdpRecv)接收并处理客户端udp包2.管理流程ManagerSwoole要达到最佳性能必须创建多个worker进程来帮助处理任务,但是Worker进程必须fork,但是fork操作是不安全的。如果没有管理,就会出现很多僵尸进程,影响服务器的性能。同时,由于程序原因,worker进程被误杀或异常退出。为了保证服务的稳定性,需要重新创建worker进程。Swoole在运行时会创建一个单独的管理进程,所有的worker进程和task进程都是从管理进程fork出来的。管理进程会监听所有子进程的退出事件。当工作进程发生致命错误或运行生命周期结束时,管理进程会回收这个进程并创建一个新进程。也就是说,“保姆”Manager进程拥有全权管理worker和task进程的创建和回收。这里再用一张图来梳理一下Manager进程和Worker/Task进程的关系。3、Worker进程Worker进程属于swoole的主逻辑进程。用户处理来自客户端的一系列请求,接受Reactor线程投递的请求数据包,执行PHP回调函数处理数据生成响应数据发送给Reactor线程,由Reactor发送threadTCP客户端可以是异步非阻塞模式,也可以是同步阻塞模式4.任务进程taskWorker进程是swoole提供的异步工作进程。这些进程主要用来处理一些耗时较长的同步任务。在工作进程中交付。3、进程查看及进程排序启动一个Swoole应用时,一共会创建2+n+m个进程,2个分别是Master进程和Manager进程,其中n为Worker进程数。m是TaskWorker进程的数量。如果不默认设置,swoole底层会根据当前机器的CPU核数启动相应数量的Reactor线程和Worker进程。我的机器有1个核心。Worker为1。所以现在我默认启动1个Master进程、1个Manager进程和1个Worker进程。如果不设置TaskWorker,则为0。当前服务器会产生3个进程。启动服务器后,在命令行查看当前生成的进程。三个进程中,所有进程的根进程,即例子中的2123进程,就是所谓的Master进程;2212进程为Manager进程;finally2321进程是一个Worker进程。客户端与服务端的交互1、客户端请求到达MainReactor,Client实际上连接到Master进程中的一个Reactor线程。2.MainReactor根据Reactor的情况将请求注册到对应的Reactor(每个Reactor都有epoll。用于监听client的变化)3.当client发生变化时,Reactor将数据交给workerforprocessing4.Worker处理完成后,通过进程间通信(如管道、共享内存、消息队列)发送到对应的reactor。5.Reactor将响应结果发送给对应的连接请求处理完成示意图:后续准备本文是学习Swoole接触过的一些知识,初步整理后发送出去。一起讨论学习,欢迎骚扰~~。后面会从网络模型入手,更好的理解swoole的实现原理,并与传统的PHP-FPM工作模式进行对比。我已经发表了一篇关于(1)如何实现单进程阻塞web服务器的文章。你可以先了解一下。如何一步一步演化成多进程master-worker模型。欢迎大家参考正文文章~
