首頁  >  文章  >  後端開發  >  PHP-FPM與Swoole的比較

PHP-FPM與Swoole的比較

藏色散人
藏色散人轉載
2020-01-20 13:15:594096瀏覽

前幾天看見有幾篇講 swoole 的文章,今天我也來湊個熱鬧。程度有限,細節理解可能不到位,歡迎大家幫我補充、修正。

PHP-FPM

早期版本的 PHP 並沒有內建的 WEB 伺服器,而是提供了 SAPI(Server API)給第三方做對接。現在非常流行的 php-fpm 就是透過 FastCGI 協定來處理 PHP 與第三方 WEB 伺服器之間的通訊。例如 Nginx php-fpm 的組合,這種方式運行的 fpm 是 Master/Worker 模式,啟動一個 Master 程序監聽來自 Nginx 的請求,再 fork 多個 Worker 程序處理請求。每個 Worker 行程只能處理一個請求,單一行程的生命週期大致如下:

1.初始化模組。

2.初始化請求。此處請求是請求 PHP 執行程式碼的意思,並非 HTTP 的請求。

3.執行 PHP 腳本。

4.結束請求。

5.關閉模組。

多進程模型是依賴進程數來解決並發問題,一個進程只能處理一個連接,當啟動大量進程,進程調度消耗可能佔CPU 的百分之幾十甚至100%,例如C10K 問題,多進程模型就力不從心了。

Swoole

Swoole 採用的也是Master/Worker 模式,不同的是Master 行程有多個Reactor 線程,Master 只是一個事件產生器,負責監聽Socket 句柄的事件變化。 Worker 以多進程的方式執行,接收 Reactor 執行緒的請求,並執行回呼函數(PHP 編寫的)。啟動 Master 進程的流程大致是:

1.初始化模組。

2.初始化請求。因為 swoole 需要透過 cli 的方式運行,所以初始化請求時,不會初始化 PHP 的全域變量,如 $_SERVER, $_POST, $_GET 等。

3.執行 PHP 腳本。包括詞法、語法分析,變數、函數、類別的初始化等,Master 進入監聽狀態,並不會結束流程。

Swoole 加速的原理

● 由 Reactor(epoll 的 IO 復用方式)負責監聽 Socket 句柄的事件變化,解決高並發問題。

● 透過記憶體常駐的方式節省 PHP 程式碼初始化的時間,在使用笨重的框架時,用 swoole 加速效果是非常明顯的。

比較不同

PHP-FPM

● Master 主程式 / Worker 多行程模式。

● 啟動 Master,透過 FastCGI 協定監聽來自 Nginx 傳輸的請求。

● 每個 Worker 程序只對應一個連接,用於執行完整的 PHP 程式碼。

● PHP 程式碼執行完畢,佔用的記憶體會全部銷毀,下次要求則需要重新進行初始化等各種繁瑣的操作。

● 只用於 HTTP Server。

Swoole

● Master 主程式(由多個Reactor 執行緒組成)/ Worker 多重處理(或多執行緒)模式

● 啟動Master ,初始化PHP 程式碼,由Reactor 監聽Socket 句柄的事件變化。

● Reactor 主執行緒負責子多執行緒的均衡問題,Manager 進程管理 Worker 多重進程,包含 TaskWorker 的進程。

● 每個 Worker 接受 Reactor 的請求,只需要執行回呼函數部分的 PHP 程式碼。

● 只在 Master 啟動時執行一遍 PHP 初始化程式碼,Master 進入監聽狀態,並不會結束進程。

● 不僅可以用於 HTTP Server,還可以建立 TCP 連線、WebSocket 連線。

以上主要針對核心運行機製作對比,列舉的不同,暫時就想到這幾點了,如果有漏掉的重點,歡迎大家幫我補充啦~

以上是PHP-FPM與Swoole的比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除