Swoole 的底層架構及運行原理

attachments-2020-06-HH0wNj4R5ee96ec901600.png

Swoole 的底層架構

首先咱們來看下 Swoole 的底層架構: 服務器

attachments-2020-06-OoU5DEm05ee96eee51dbe.jpg

咱們能夠看到,Swoole 主要包含如下組件:多線程

  • Master:當咱們運行啓動 Swoole 的 PHP 腳本時,首先會建立該進程(它是整個應用的 root 進程),而後由該進程 fork 出 Reactor 線程和 Manager 進程。
  • Reactor:Reactor 是包含在 Master 進程中的多線程程序,用來處理 TCP 鏈接和數據收發(異步非阻塞方式)。Reactor 主線程在 Accept 新的鏈接後,會將這個鏈接分配給一個固定的 Reactor 線程,並由這個線程負責監聽此 socket。在 socket 可讀時讀取數據,並進行協議解析,將請求投遞到 Worker 進程;在 socket 可寫時將數據發送給 TCP 客戶端。
  • Manager:Manager 進程負責 fork 並維護多個 Worker 子進程。當有 Worker 子進程停止時,Manager 負責回收並建立新的 Worker 子進程,以便保持 Worker 進程總數不變;當服務器關閉時,Manager 將發送信號給全部 Worker 子進程,通知其關閉服務。
  • Worker:以多進程方式運行,每一個子進程負責接受由 Reactor 線程投遞的請求數據包,並執行 PHP 回調函數處理數據,而後生成響應數據併發給 Reactor 線程,由 Reactor 線程發送給 TCP 客戶端。全部請求的處理邏輯都是在 Worker 子進程中完成,這是咱們編寫業務代碼時真正要關心的部分。
  • Task Worker:功能和 Worker 進程相似,一樣以多進程方式運行,但僅用於任務分發,當 Worker 進程將任務異步分發到任務隊列時,Task Worker 負責從隊列中消費這些任務(同步阻塞方式處理),處理完成後將結果返回給 Worker 進程。

Swoole 官方對 Reactor、Worker、Task Worker有一個形象的比喻,若是把基於 Swoole 的 Web 服務器比做一個工廠,那麼 Reactor 就是這個工廠的銷售員,Worker 是負責生產的工人,銷售員負責接訂單,而後交給工人生產,而 Task Worker 能夠理解爲行政人員,負責提工人處理生產之外的瑣事,好比訂盒飯、收快遞,讓工人能夠安心生產。架構

Swoole 的生命週期回調函數

瞭解了 Swoole 的底層架構後,咱們再來看看那些 Swoole 生命週期中的回調函數在哪些進程的哪一個階段被調用,當 Master 主進程啓動或關閉時會觸發下面這兩個回調函數:併發

onStart
onShutdown

而 Manager 管理進程啓動或關閉時會觸發下面這兩個回調函數:異步

onManagerStart
onManagerStop

Worker 進程的生命週期中,有多個回調函數:socket

`onWorkerStart:Worker 進程啓動時
onWorkerStop: Worker 進程關閉時
onConnect:鏈接創建時
onClose:鏈接關閉時
onReceive:收到請求數據時
onFinish:投遞的任務處理完成時`函數

Task Worker 進程也有兩個回調函數,分別在spa

onTask:由新任務投遞過來時
onWorkerStart:Task Worker 進程啓動時也會觸發

咱們平常開發中主要關注的是 Worker 進程的回調函數,只須要在服務器實例上監聽相應的事件,並編寫對應的回調函數來處理相應的業務邏輯便可。線程

attachments-2020-06-eQ6PbHcj5ee96e9a60982.jpg

相關文章
相關標籤/搜索