workerman和swoole在現階段很紅,有時間得認識認識,不然你就不是混php圈的。 swoole是使用C語言實現的socket通訊框架,workerman則是使用純php實現的socket框架,二者進程模型上也存在著許多的不同。
先說下swoole的流程模型,看以下解析圖。
master進程
這個進程比較複雜,也是我認為最核心的進程,這是一個包含多執行緒的進程,分別是一個主線程和n個reactor線程(數量可以配置)。其中,主線程用於accept新的連接,然後評估一下每個reactor線程負責維護的連接數,然後分配給數量最少的那個reactor線程,最大程度保證每個reactor線程的負載量是均衡的。本質上講,一旦一個socket可讀或可寫了,就由reactor線程發送給worker進程或發送會客戶端。除此之外,主線程還負責對所有訊號的接管,避免reactor線程收到訊號的打擾中斷。說的洋氣點兒就是:master進程負責了連接的accept、託管、socket的可讀可寫(資料的發送和接受),本質上講,master進程負責了IO。還需要注意一點兒的是reactor線程是徹底的全非同步非阻塞工作方式。
manager進程
manager進程是worker進程和taskworker進程的媽,說的洋氣點兒就是manager進程fork出來了worker進程和taskworker進程,生出來了就得管,所以,manager進程得負責對worker進程和taskworker進程的撫養義務,具體包括監控它們的狀態、當它們意外掛了後重新拉起一個新的進程(避免了殭屍進程)、平滑重啟(就是傳說中的reload)。
worker進程
worker進程是manager進程fork出來的,這個進程說白了就是搬磚工作(官方文件中屢次提到的業務代碼),其實就是平時碼的那些curd業務邏輯代碼,懂了吧?只不過worker進程比較diao的是,這個行程可以用非同步方式去運作,也可以用同步方式去工作。如果聽不懂什麼意思,那就先背過,先混個臉熟再說。
taskworker進程
taskworker進程(後文稱為tasker進程)實際上本質上也是worker進程,只不過是一種特殊的worker進程。如果你的worker進程中存在一些耗時耗力的操作,那麼可以先拋給tasker進程,自己先去幹別的,等tasker乾完了,再由worker進程取回,非常diao。但是tasker進程只能工作在同步方式下,並不能使用非同步。這就是為什麼tasker進程不可以使用定時器,而worker進程可以使用定時器的原因。
簡單總結混在一起說下這幾種進程之間是怎麼搭配起來工作的。簡單來說,就是master進程就是接活兒的銷售,但是具體幹活則由worker進程來做,如果worker進程感覺到某些流程太繁忙複雜就可以讓tasker進程來做。而manager進程就是後勤worker進程和takser進程的人力資源保障部,負責他們的生死存亡和吃喝拉撒。
而workerman的進程模型相對就要簡單很多了,首先相對於swoole來說,workerman沒有swoole中的reator線程,其次workerman沒有用於處理普通業務的worker進程以及tasker進程。而workerman的話,socket是由worker進程負責的,swoole中則是由主進程中的reactor線程來負責的。而swoole在接受到資料後,可以透過自己的worker進程來處理業務(有點類似fpm進程)。
workerman是一個高效能的PHP socket 伺服器框架,workerman基於PHP多進程以及libevent事件輪詢庫,PHP開發者只要實作一兩個接口,便可以開發出自己的網路應用,例如Rpc服務、聊天室伺服器、手機遊戲伺服器等。
workerman的目標是讓PHP開發者更容易的開發出基於socket的高效能的應用服務,而不用去了解PHP socket以及PHP多進程細節。 workerman本身就是一個PHP多進程伺服器框架,具有PHP進程管理以及socket通訊的模組,所以不依賴php-fpm、nginx或apache等這些容器便可以獨立運行
其中
# workerman有兩種行程模型
1、基本的master worker模型
2、master gateway worker模型
master worker模型工作流程及行程間關係如下:
master worker模型說明:
#master進程為主進程,啟動過程中讀取conf配置,根據每個應用程式配置中的ip和連接埠建立監聽socket,然後再根據配置中的進程數建立對應數量的子進程即worker進程,worker進程會自動繼承master進程創建的監聽socket,使得worker進程能夠獨立的接受並處理客戶端的連線。而後master進程進入監聽訊號的邏輯中,監聽worker進程退出訊號(worker進程退出後,系統會自動向master程式發送一個SIGHCLD訊號,mater進程會重新建立子進程,將缺少的子程式補上),master進程也會監聽workermand腳本發送的停止訊號(SIGINT)和平滑重啟服務訊號(SIGHUP)
worker進程為master進程派生出來的子進程,自動繼承了master進程的監聽socket,每個worker進程獨立的接受並處理客戶端的連線。
master worker模型比較適合業務簡單的應用或短連線應用
master gateway worker模型工作流程與行程間關係如下:
master gateway worker 模型說明:
這種模型多了一個gateway進程組,工作流程與master worker模型基本上相同,差異在於worker進程不再直接與客戶端打交道,客戶端與worker進程之間多了一個gateway進程,gateway專職處理網路IO,並維護客戶端的長連線。
master gateway worker 模型非常適合長連結應用
當我們業務程式碼以同步阻塞方式來使用swoole和workerman的時候,swoole則很想nginx fpm的二合一體,而workerman則只相當於nginx