天天看點

swoole入門一、 swoole簡介二、swoole與workman的差別三、swoole安裝四、swoole的程序管理模式

一、 swoole簡介

 swoole是一個為PHP用C和C++編寫的基于事件的高性能異步&協程并行 網絡通信引擎

使 PHP 開發人員可以編寫高性能的協程 TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 可以廣泛應用于網際網路、移動通信、企業軟體、雲計算、網絡遊戲、物聯網(IOT)、車聯網、智能家居等領域。使用 PHP + Swoole 作為網絡通信架構,可以使企業 IT 研發團隊的效率大大提升,更加專注于開發創新産品。

拆分了解:

. swoole 是一個php的擴充,是由 C/C++ 編寫的

. swoole 是基于事件的 高性能異步&協程并行 的網絡通信引擎

根據關鍵詞了解事件,異步 - 協程并行,網絡通信引擎;

事件:

就是某一個動作發生的時候就可以稱之為事件,例子:前台 js 的滑鼠點選事件。

異步/攜程/并行:

暫時可以了解為隻是一種程式執行的模式。

二、swoole與workman的差別

相同點:workerman和swoole都是php socket 伺服器架構,都支援長連接配接、tcp和udp、websocket、異步、分布式部署等

1、swoole是使用C語言實作的socket通信架構,workerman則是使用純php實作的socket架構,二者程序模型上也存在很多的不同。

swoole的程序模型

swoole入門一、 swoole簡介二、swoole與workman的差別三、swoole安裝四、swoole的程式管理模式

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程序比較屌的是,這個程序可以用異步方式去工作,也可以用同步方式去工作。

  • taskworker程序

taskworker程序(後文中稱tasker程序)實際本質上也是worker程序,隻不過是一種特殊的worker程序。如果你的worker程序中存在一些耗時耗力的操作,那麼可以先抛給tasker程序,自己先去幹别的,等tasker幹完了,再由worker程序取回,非常屌。但是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模型工作流程及程序間關系如下:

swoole入門一、 swoole簡介二、swoole與workman的差別三、swoole安裝四、swoole的程式管理模式

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模型工作流程和程序間關系如下:

swoole入門一、 swoole簡介二、swoole與workman的差別三、swoole安裝四、swoole的程式管理模式

master gateway worker 模型說明:

這種模型多了一個gateway程序組,工作流程與master worker模型基本相同,差別是worker程序不再直接與用戶端打交道,用戶端與worker程序之間多了一個gateway程序,gateway專職處理網絡IO,并維護用戶端的長連接配接。

master gateway worker 模型非常适合長連接配接應用

當我們業務代碼以同步阻塞方式來使用swoole和workerman的時候,swoole則很像nginx+fpm的二合一體,而workerman則隻相當于nginx,這就是差別啦!

2、swoole可以直接安裝使用,workman需要安裝其他拓展,swoole使用友善,可以直接引用。

外部依賴上workerman需要依賴很多額外的第三方PHP擴充來實作,局限性比較大,這些擴充并非是PHP官方維護的,維護性方面良莠不齊,有些擴充連PHP7都不支援,數年沒人維護。而Swoole基本上無依賴,底層的代碼全部可控。

開發維護方面,Swoole的開發團隊目前有大概18人左右,開發者基本上都是來自騰訊、百度、阿裡、滴滴、微網誌等國内一線網際網路企業,支援維護的團隊更穩定

3、swoole采用協程,workman暫不支援

協程的優點: 

  • 協程是程序和線程的更新版,程序和線程都面臨着核心态和使用者态的切換問題而耗費許多切換時間,而協程就是使用者自己控制切換的時機,不再需要陷入系統的核心态。
  • 協程的執行效率非常高。因為子程式切換不是線程切換,而是由程式自身控制。是以,沒有線程切換的開銷,和多線程相比,線程數量越多,相同數量的協程展現出的優勢越明顯
  • 不需要多線程的鎖機制。由于隻有一個線程,也不存在同時寫變量的沖突,在協程中控制共享資源不需要加鎖,隻需要判斷資料的狀态,是以執行效率遠高于線程 ,對于多核CPU可以使用多程序+協程來盡可能高效率地利用CPU。

4、當然workerman的優勢是它完全使用PHP代碼實作,開發者可以直接看它的源碼。有特殊需求也可以直接改源碼來實作。如果換成swoole就不是那麼簡單了。

workerman做的事情更多一些,即是架構又是工具和完整的解決方案,對于沒有太多後端程式設計功底的程式員也來說确實會容易很多。

而swoole實際上隻是一個底層庫,不是拿來可用的完整産品,基于swoole有很多PHP的架構和程式,比如tsf、zan php framework、hprose-swoole、zphp、swoole/framework、blink、dorarpc、SwooleDistributed等等,普通開發者可以直接基于這些項目進行開發。

三、swoole安裝

環境說明:

系統:centos-7.6.18 

內建工具:寶塔

Php:7.2.0 >

Swoole: 最新版本 4.5.6

1、虛拟機上安裝寶塔:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
           

2、在寶塔上安裝nginx、php

3、擷取swoole檔案安裝包 并下載下傳安裝包

# 第一種:  直接在目前目錄下載下傳檔案 安裝包

git clone https://github.com/swoole/swoole-src/releases(如果此指令不能下載下傳可以直接去這個網址上下載下傳下來後并上傳到虛拟機上)

# 第二種: 直接在github/ 碼雲上下載下傳安裝包

github 位址:https://github.com/search?q=swoole

碼雲位址:https://gitee.com/swoole/swoole
           

4、解壓壓縮包

在swoole 檔案中 運作 phpize找到這個檔案的位置運作 生成 configure 檔案

cd swoole

phpize

./configure --with-php-config=/www/server/php/72/bin/php-config  

make && make install
           

5、編譯安裝到系統成功後,需要在 php.ini 中加入一行 extension=swoole.so 來啟用 Swoole 擴充

6、測試:php –ri swoole

四、swoole的程序管理模式

swoole程序分為三種角色:reactor線程、worker程序、taskworker程序

  • reactor線程

    負責維護用戶端TCP連接配接、處理網絡IO、處理協定、收發資料

    完全是異步非阻塞的模式

    全部為C代碼,除Start/Shudown事件回調外,不執行任何PHP代碼

    将TCP用戶端發來的資料緩沖、拼接、拆分成完整的一個請求資料包

    Reactor以多線程的方式運作

  •  Worker程序

    接受由Reactor線程投遞的請求資料包,并執行PHP回調函數處理資料

    生成響應資料并發給Reactor線程,由Reactor線程發送給TCP用戶端

    可以是異步非阻塞模式,也可以是同步阻塞模式

    Worker以多程序的方式運作

  •  TaskWorker程序

    接受由Worker程序通過swoole_server->task/taskwait方法投遞的任務

    處理任務,并将結果資料傳回(使用swoole_server->finish)給Worker程序

    完全是同步阻塞模式

    TaskWorker以多程序的方式運作

  •  圖解swoole程序關系:
    swoole入門一、 swoole簡介二、swoole與workman的差別三、swoole安裝四、swoole的程式管理模式

swoole中的reactor線程、worker程序、taskworker程序之間的關系類似于nginx與php-fpm之間的關系。

master程序啟動後,建立reactor線程和manager程序。

reactore用于監聽請求,并将請求下發給worker程序。(類似于nginx)

worker程序将耗時的處理轉發給task程序處理。(類似于php-fpm)

manager程序用來管理worker程序和task程序,當worker、task程序處理了一定的連接配接(max_request)後自動重新開機,防止記憶體洩漏。

底層會為Worker程序、TaskWorker程序配置設定一個唯一的ID

不同的Worker和TaskWorker程序之間可以通過sendMessage接口進行通信