我們來使用實例進行分析:
``` 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進程。