天天看點

swoole 對比php fpm,PHP-FPM與Swoole的比較

前幾天看見有幾篇講 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 連接配接。

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