swoole 相關

JaneWorld發表於2019-06-15

swoft框架:https://www.swoft.org/docs

同步客戶端:同步client是同步阻塞的。一整套connect->send()->rev()->close()是同步進行的。

非同步客戶端:
swoole

1、Master程式:主程式
1.1、MainReactor(主執行緒)
主執行緒會負責監聽server socket,如果有新的連線accept,主執行緒會評估每個Reactor執行緒的連線數量。將此連線分配給連線數最少的reactor執行緒,做一個負載均衡。
1.2 、Reactor執行緒組
Reactor執行緒負責維護客戶端機器的TCP連線、處理網路IO、收發資料完全是非同步非阻塞的模式。
swoole的主執行緒在Accept新的連線後,會將這個連線分配給一個固定的Reactor執行緒,在socket可讀時讀取資料,並進行協議解析,將請求投遞到Worker程式。在socket可寫時將資料傳送給TCP客戶端。
1.3、心跳包檢測執行緒(HeartbeatCheck)
Swoole配置了心跳檢測之後,心跳包執行緒會在固定時間內對所有之前線上的連線
傳送檢測資料包
1.4、UDP收包執行緒(UdpRecv)
接收並且處理客戶端udp資料包

2、Manger程式:管理程式
所有的worker程式和task程式都是從管理程式Fork出來的。管理程式會監視所有子程式的退出事件,當worker程式發生致命錯誤或者執行生命週期結束時,管理程式會回收此程式,並建立新的程式。換句話也就是說,對於worker、task程式的建立、回收等操作全權有“保姆”Manager程式進行管理。

3、Worker程式:工作程式
worker 程式屬於swoole的主邏輯程式,使用者處理客戶端的一系列請求,接受由Reactor執行緒投遞的請求資料包,並執行PHP回撥函式處理資料生成響應資料併發給Reactor執行緒,由Reactor執行緒傳送給TCP客戶端可以是非同步非阻塞模式,也可以是同步阻塞模式。

4、Task程式:非同步任務工作程式
taskWorker程式這一進城是swoole提供的非同步工作程式,這些程式主要用於處理一些耗時較長的同步任務,在worker程式當中投遞過來。

心跳是什麼?
swoole裡,心跳是指用來判斷一個連線是正常還是斷開的

為什麼要心跳?

心跳的目的其實是通過判斷客戶端是否存活,從而回收fd,系統為什麼要回收fd,因為fd資源是有限的,所以必需重複利用

心跳作用主要有兩個:
1、客戶端定時給服務端傳送點資料,防止連線由於長時間沒有通訊而被某些節點的防火牆關閉導致連線斷開的情況。
2、服務端可以通過心跳來判斷客戶端是否線上,如果客戶端在規定時間內沒有發來任何資料,就認為客戶端下線。這樣可以檢測到客戶端由於極端情況(斷電、斷網等)下線的事件。

什麼是 TCP 粘包?
TCP 粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。

TCP 出現粘包的原因?
傳送方:傳送方需要等緩衝區滿才傳送出去,造成粘包
接收方:接收方不及時接收緩衝區的包,造成多個包接收

swoole怎麼處理粘包?
通過約定結束符EOF,來確定包資料是否傳送完畢
開啟open_eof_check=true,並用package_eof來設定一個完整資料結尾字元,同時設定自動拆分open_eof_split

本作品採用《CC 協議》,轉載必須註明作者和本文連結