1、swoole結構圖
2、swoole流程圖
3、詳細流程圖
3.1、Master:處理核心事件驅動(主進程)
3.2、Reactor:
處理TCP連接,收發數據的線程。Swoole的主線程在Accept新的連接后,會將這個連接分配給一個固定的Reactor線程,並由這個線程負責監聽此socket。在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫時將數據發送給TCP客戶端。,
3.2.1、負責維護客戶端TCP連接、處理網絡IO、處理協議、收發數據
3.2.2、完全是異步非阻塞的模式
3.2.3、全部為C代碼,除Start/Shudown事件回調外,不執行任何PHP代碼
3.2.4、將TCP客戶端發來的數據緩沖、拼接、拆分成完整的一個請求數據包
3.2.5、Reactor以多線程的方式運行
3.3、Manager進程:
3.3.1、swoole中worker/task進程都是由Manager進程Fork並管理的。
3.3.2、子進程結束運行時,manager進程負責回收此子進程,避免成為僵屍進程。並創建新的子進程
3.3.3、服務器關閉時,manager進程將發送信號給所有子進程,通知子進程關閉服務
3.3.4、服務器reload時,manager進程會逐個關閉/重啟子進程
3.4、Worker進程:處理客戶端請求
3.4.1、接受由Reactor線程投遞的請求數據包,並執行PHP回調函數處理數據
3.4.2、生成響應數據並發給Reactor線程,由Reactor線程發送給TCP客戶端
3.4.3、可以是異步非阻塞模式,也可以是同步阻塞模式
3.4.4、Worker以多進程的方式運行
3.5、Task進程:異步工作進程
3.5.1、接受由Worker進程通過swoole_server->task/taskwait方法投遞的任務
3.5.2、處理任務,並將結果數據返回(swoole_server->finish)給Worker進程
3.5.3、完全是同步阻塞模式
3.5.4、TaskWorker以多進程的方式運行
3.6、Reactor、Worker、TaskWorker的關系:
3.6.1、可以理解為Reactor就是nginx,Worker就是php-fpm。Reactor線程異步並行地處理網絡請求,然后再轉發給Worker進程中去處理。Reactor和Worker間通過UnixSocket進行通信。
3.6.2、在php-fpm的應用中,經常會將一個任務異步投遞到Redis等隊列中,並在后台啟動一些php進程異步地處理這些任務。Swoole提供的Worker是一套更完整的方案,將任務的投遞、隊列、php任務處理進程管理合為一體。通過底層提供的API可以非常簡單地實現異步任務的處理。另外TaskWorker還可以在任務執行完成后,再返回一個結果反饋到Worker。
3.6.3、Swoole的Reactor、Worker、TaskWorker之間可以緊密的結合起來,提供更高級的使用方式。
3.6.4、一個更通俗的比喻,假設Server就是一個工廠,那Reactor就是銷售,接受客戶訂單。而Worker就是工人,當銷售接到訂單后,Worker去工作生產出客戶要的東西。而TaskWorker可以理解為行政人員,可以幫助Worker干些雜事,讓Worker專心工作。
3.6.5、底層會為Worker進程、TaskWorker進程分配一個唯一的ID
3.6.6、不同的Worker和TaskWorker進程之間可以通過sendMessage接口進行通信
3.7、 Task進程
Task流程圖
- Task和Worker進程的通信通過unix socket進行
- Task數據傳遞大小小於8K直接管道傳遞,大於8K寫入臨時文件傳遞
- Task傳遞對象 i.可以通過序列化傳遞一個對象的拷貝(非應用)ii.Task對象的改變不會反應到worker中(連個進程中是獨立的)iii.數據庫連接,網絡連接對象不可傳遞
- Task的Onfinish的回調會傳遞給調用給該task方法的worker進程(原路返回可尋)
Task 用途:
模擬Mysql連接池
3. 8、Timer定時器
- Timer基於epoll的timeout機制實現
- 使用堆存放Timer,提高檢索效率