`Master`進程是一個多線程進程,其中有一組非常重要的線程,叫做`Reactor`線程(組),每當一個客戶端連接上服務器的時候,都會由Master進程從已有的Reactor線程中,根據一定規則挑選一個,專門負責向這個客戶端提供維持鏈接、處理網絡IO與收發數據等服務。分包拆包等功能也是在這里完成。
`Manager`進程,某種意義上可以看做一個代理層,它本身并不直接處理業務,其主要工作是將Master進程中收到的數據轉交給Worker進程,或者將Worker進程中希望發給客戶端的數據轉交給Master進程進行發送。
`Manager`進程還負責監控Worker進程,如果Worker進程因為某些意外掛了,Manager進程會重新拉起新的Worker進程,有點像Supervisor的工作。而這個特性,也是最終實現熱重載的核心機制。
`Worker`進程其實就是處理各種業務工作的進程,Manager將數據包轉交給Worker進程,然后Worker進程進行具體的處理,并根據實際情況將結果反饋給客戶端。
我們可以總結出來上面簡單的Server,當客戶端連接的時候這個過程中,三種進程之間是怎么協作的:
1. Client主動Connect的時候,Client實際上是與Master進程中的某個Reactor線程發生了連接。
2. 當TCP的三次握手成功了以后,由這個Reactor線程將連接成功的消息告訴Manager進程,再由Manager進程轉交給Worker進程。
3. 在這個Worker進程中觸發了OnConnect的方法。
4. 當Client向Server發送了一個數據包的時候,首先收到數據包的是Reactor線程,同時Reactor線程會完成組包,再將組好的包交給Manager進程,由Manager進程轉交給Worker。
5. 此時Worker進程觸發OnReceive事件。
6. 如果在Worker進程中做了什么處理,然后再用Send方法將數據發回給客戶端時,數據則會沿著這個路徑逆流而上。
Swoole進程/線程結構圖:

現在,我們基于上面的例子修改代碼,來看看一個簡單的多進程Swoole Server的幾個基本配置:
``` php
<?php
$server->set(array(
'demonize' => false,//是否后臺運行
'reactor_num' => 2,
'worker_num' => 4
));
$server -> start();
```
`reactor_num`:表示Master進程中,Reactor線程總共開多少個,注意,這個可不是越多越好,因為計算機的CPU是有限的,所以一般設置為與CPU核心數量相同,或者兩倍即可。
`worker_num`:表示啟動多少個Worker進程,同樣,Worker進程數量不是越多越好,仍然設置為與CPU核心數量相同,或者兩倍即可。
我們可以在Shell里運行,使用pstree查看進程模型結構:
```
php swoole_tcp_server.php
pstree -ap|grep swoole_tcp
| | `-php,2505 swoole_tcp_server.php
| | |-php,2507 swoole_tcp_server.php
| | | |-php,2510 swoole_tcp_server.php
| | | |-php,2511 swoole_tcp_server.php
| | | |-php,2512 swoole_tcp_server.php
| | | `-php,2513 swoole_tcp_server.php
```