1. 程式人生 > >Swoole學習筆記(一):架構概述

Swoole學習筆記(一):架構概述

數據大小 同步 sock 分享 分配 快的 復雜 客戶端 及其

swoole雖然是標準的PHP擴展,實際上與普通的擴展不同。普通的擴展只是提供一個庫函數。而swoole擴展在運行後會接管PHP的控制權,進入事件循環。
在swoole中,有一個master進程(父進程)和多個worker進程(子進程),這個和nginx,fpm屬於同一種模型。

1.進程和子進程
關於進程的概念不多贅述,進程中最重要的兩個部分,一是內存:包括堆棧,各種變量等等;二是上下文切換,如操作系統資源、信號量和自身狀態等等;
子進程由父進程創建,但是子進程擁有獨立的內存和上下文環境:
1)子進程會復制父進程的內存空間和上下文環境。註意,這裏是復制,並不是共享內存,這和線程是不同的。
2)修改某個子進程的內存空間,不會修改父進程或其他子進程中的內存空間;

3)子進程會復制父進程的IO句柄(fd描述符);

2.進程間的通訊方式
進程之間常見的通訊方式如下:
1)管道pipe:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
2)命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
3)消息隊列MessageQueue:消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
4)共享存儲SharedMemory:共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。

5)信號量Semaphore:信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6)套接字Socket:套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。
7)信號 ( sinal ) : 信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
在swoole中,子進程間的通訊是通過共享內存實現的:
技術分享圖片
共享內存具有如下的特點:
共享內存不屬於任何一個進程;
共享內存中分配的內存可以被任何進程訪問,只要有這塊共享內存的key值就好;
即使進程退出,共享內存仍然可以技術保留;

3.swoole的整體架構
swoole的整體架構如下:
技術分享圖片
swoole中進程間的通信是通過管道實現的。
1) master用來處理swoole核心的事件驅動
Main Reactor:總線程,負責線程任何調度
Reactor:線程,每一個子線程包含一個epoll實例的實現
2) manager
負責管理,不會運行任何用戶層的業務邏輯,只負責進程的管理和分配
3) worker
主邏輯進程,處理來自客戶端的請求
當woker進程被關閉,manager會重新拉起一個進程,保證woker的總數量
4) task
異步工作進程,處理耗時較長的任務

4.task與woker
task與woker之間是通過unix Sock管道進行通訊的,也可以通過消息隊列進行實現
技術分享圖片
1.Task傳遞數據大小
數據小於8K,直接通過管道傳遞,數據大於8K,寫入臨時文件傳遞
2.Task傳遞對象
可以通過序列化傳遞一個對象的拷貝;
Task中對對象的改變不會反映到Worker進程中;
數據庫連接,網絡連接對象不可以傳遞。
3.Task的onFinish回調
Task的onFinish回調會發回調用task方法的Worker進程(投遞者)

Swoole學習筆記(一):架構概述