在 Mix V2.1 以前的版本一直採用與如今主流的 Swoole 框架同樣基於多進程 Swoole\Server 開發,V2.1 開始 Mix 所有基於 Swoole 的 Coroutine/Server 開發 (單線程協程),讓 Server 也可以使用徹底同步的編程方式,底層自動實現異步IO。php
Reactor+Manager+Worker 多進程優缺點
Master+Worker 的進程模型是一種應用普遍的傳統模型,像 Nginx、PHP-FPM 均採用這種模型,但 Swoole 的模型中多了一個 Manager 進程。html
優勢:git
- 可自行重啓: Reactor+Manager+Worker 進程架構最大的優勢就是,當 Worker 出現任何異常,無需藉助第三方 (如:supervisor、pm2) 便可由程序自己的 Manager 進程重啓一個 Worker 進程。
- 可利用多CPU: 因爲是多進程模型,Worker 進程執行在多個CPU中,所以可利用到多核。
- 阻塞影響小: 由於 Reactor 多線程負責鏈接處理,而多個 Worker 進程負責執行 PHP 代碼,所以單個 Worker 的阻塞IO並不會影響其餘請求 (協程模式,會影響到分配到該進程但沒有執行完成的請求)
缺點:github
- 編碼複雜、不夠靈活: Swoole\Server 在啓動前與啓動後 class 的屬性操做的做用域,對不熟悉的用戶很是不友好,容易掉坑,難以理解。處理一些全局業務時須要跨進程處理,帶來併發安全鎖的問題,且沒法同時啓動多個 Server 或者自由的在代碼中隨意啓動中止 Server。
- 平滑shutdown困難: 因爲程序執行在不少個 Worker 進程中,若是存在耗時任務,多進程模型很難精細的控制每一個子進程執行完管道的所有請求,而後平滑有序的退出全部進程,Swoole\Server 雖然提供了 異步安全重啓特性 可是大部分框架是沒有處理 onWorkerExit 的,用戶也很難在框架基礎上擴展。
單線程協程優缺點
單線程模型在新創軟件領域很是流行,像 Redis、Node.js 都是單線程模型,而優缺點恰好與 Reactor+Manager+Worker 相反,可是 Mix 針對這些缺點提供瞭解決方案。docker
缺點:編程
- 沒法自行重啓: Mix V2.1 這個問題廣泛存在於全部單進程程序中,包括 Golang、Node.js 開發的程序,在出現致命異常時都會致使進程退出,因爲是單進程因此沒法自行重啓,都須要藉助第三方 (如:supervisor、pm2)
- 沒法利用多CPU: 因爲是單進程模型,執行在一個CPU中,所以和 Node.js 同樣沒法利用多核 (使用 docker 部署則無此問題)。
- 阻塞影響大: 單進程模型因爲 Server 與業務邏輯一同執行在單個進程內,所以當遇到阻塞IO時,全部請求處理都會一塊兒阻塞,致使響應時間變長,長時間的阻塞還會致使服務沒法接收新的請求,Swoole 雖然 Hook 了大量的阻塞IO能支持協程,但仍是有許多擴展是沒法支持的,所以該問題最爲突出。
優勢:安全
- 編碼簡單、靈活: 因爲是單進程單線程模型,加上 Server 所有基於 Swoole 的 Coroutine/Server 開發,徹底同步的編程方式,所以代碼很是簡單易懂。也沒有了多進程帶來的:跨進程對象屬性分歧問題,併發安全鎖問題,Server 也可隨意啓動 N 個、隨意中止。
- 平滑shutdown簡單: 單線程模型,處理信號只需處理一個進程,退出也只需處理一個進程,因爲是同步編程方式,退出的處理邏輯也很是簡單易懂。
對缺點的解決方案
經過上面分析能夠得出結論:單線程更加簡單靈活,可是最大的缺點就是阻塞問題,和多CPU利用問題,Mix V2.1 如何解決這些問題:swoole
-
多CPU利用: 與 Node.js 解決該問題的方法同樣,經過多開進程來解決多CPU利用問題,因爲同一個端口只能被一個程序綁定,所以多開只能綁定不一樣端口,勢必增長了反向代理的複雜度,但在 Linux v3.10 或更高版本內核中加入了端口複用功能,Mix 內置的 Server 只需啓動時增長
-r
參數便可在 Linux 中多開端口複用,達到與 Node.js 相似的解決多CPU利用的效果,查看範例。多線程 -
阻塞: 單進程單線程模型中要完全解決 PHP 歷史遺留的阻塞IO問題,只能經過把阻塞代碼集中放入到其餘一個或者多個進程中去執行,相似 Swoole 的 Task,不一樣的是 Mix 獲取執行結果是同步編程方式,Mix 會封裝一個同步執行器,在代碼中調用同步執行器傳入一個閉包,閉包中包含阻塞IO調用代碼,調用後同步獲取結果(協程方式),該閉包的代碼將經過 unixsocket 的方式傳遞到同步執行器的進程執行,執行完成後回傳結果。該同步執行器進程與其餘 Server 同樣可自行添加代碼,可在啓動時增長
-r
參數端口複用多開,Mix 經過這種方式將阻塞代碼集中在同步執行器進程中執行,完全避免阻塞帶來的影響。閉包
解決這些問題後,綜合考量單線程協程顯然更加符合 Mix 短小精悍、簡單易用的定位,Mix V2.1 是截止如今惟一全面使用 Coroutine/Server 的框架。