我们来使用实例进行分析:
``` php
<?php
$server = new \swoole_server("127.0.0.1",8088);//默认是多进程模式、TCP类型
$server->on('connect', function ($serv, $fd){ });
$server->on('receive', function ($serv, $fd, $from_id, $data){ });
$server->on('close', function ($serv, $fd){ });
$server -> start();
```
继续在Shell中输入以下命令:
``` shell
php swoole_tcp_server.php
pstree -ap|grep swoole_tcp_server
| | `-php,2454 swoole_tcp_server.php
| | |-php,2456 swoole_tcp_server.php
| | | `-php,2458 swoole_tcp_server.php
```
从系统的输出中,我们可以很容看出server其实有3个进程,进程的pid分别是2454、2456、2458,其中2454是2456的父进程,而2456又是2458的父进程。
> 所以,其实我们虽然看起来只是启动了一个Server,其实最后产生的是三个进程。
这三个进程中,所有进程的根进程(2454),就是所谓的`Master`进程;而2456进程,则是`Manager`进程;最后的2458进程,是`Worker`进程。
基于此,我们简单梳理一下,当执行的start方法之后,发生了什么:
- 守护进程模式下,当前进程fork出Master进程,然后退出,Master进程触发OnMasterStart事件。
- Master进程启动成功之后,fork出Manager进程,并触发OnManagerStart事件。
- Manager进程启动成功时候,fork出Worker进程,并触发OnWorkerStart事件。
> 非守护进程模式下,则当前进程直接作为Master进程工作。
所以,一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程、Manager进程和Worker进程。
事实上,一个多进程模式下的Swoole Server中,有且只有一个Master进程;有且只有一个Manager进程;却可以有n个Worker进程。