PHP 處理程序(CGI vs FastCGI vs Mod_PHP vs suPHP)有什麼區別?
我知道那裡有四種不同的 PHP 處理程序(AFAIK)。
- CGI (php-cgi)
- FastCGI (php-fpm)
- 模組_PHP
- 蘇PHP
我需要了解這些處理程序的優缺點,以及每個處理程序適合哪些環境?
例如,如果我正在執行一個共享託管伺服器,那麼上述哪個處理程序適合我?或者,如果我正在管理私人伺服器?
這些並不是真正的“6 PHP 類型”,而是兩種 PHP 類型,每一種都執行在 3 個不同的 Apache 實現中。
suphp、suphp_worker 和 suphp_event
suPHP本身是 PHP 的包裝器,在給定的使用者權限下執行 PHP(例如,與執行 Apache 的權限不同)加上一個允許您執行 suPHP 的 Apache 模組(mod_suphp)——基本上是在 CGI 模式下。CGI 模式簡化意味著傳遞給 PHP 的每個請求都會啟動一個新的 PHP(執行時)程序。就 CPU 使用而言,這很昂貴,並且與持久的 PHP 執行時相比更慢(我猜大約是 3-5 倍)。
我假設第一個變體使用Apache 的 prefork MPM,它被廣泛使用和測試,但與其他 MPM 相比相當慢。Prefork 就像它的名字所暗示的那樣:它分叉給定數量的 apache 程序並保持它們可用於傳入請求。
下一個 (suphp_worker) 改為使用worker MPM。Worker 是預先生成的程序和執行緒的混合體,它通常比 prefork 更快(用於傳遞大約兩倍的靜態內容)並且使用更少的記憶體。
最後一個 (suphp_event) 似乎使用了 suPHP + MPM event,它再次使用了另一個程序/執行緒模型而不是 worker。從我見過的基準測試來看,事件和工作人員的速度大致相同——事件 MPM(至少使用 Apache 2.2,您的提供商可能會這樣做)被標記為實驗性的。
mod_php、mod_php_ruid2 和 mod_php_itk
這是一種不同的 PHP 處理程序實現:Apache 預先啟動 PHP 執行時並將傳入請求傳遞給它,並根據需要生成新程序。這比 suPHP 快很多,但缺點是沒有使用者權限分離:所有 php 程序都在與 Apache 本身相同的權限下執行。
第一個變體可能使用 prefork MPM(如上所述),因為 mod_php 與來自 worker 或 event 的執行緒模型不兼容。
第二個變體 (mod_php_ruid2) 似乎另外使用了 Apache 模組mod_ruid2,它允許您在不同的使用者權限下執行每個 Apache VirtualHost - 這包括 PHP 程序。它有一長串您應該考慮的不兼容性。
最後一個變體 (mod_php_itk) 使用第三方ITK MPM for Apache,它是 Apache prefork MPM 的一個分支,帶有在給定使用者權限下執行每個 VirtualHost 的選項。它還使您能夠對每個 VirtualHost 實施額外的限制(例如客戶端數量)。
建議
如果這些是您唯一的選擇,並且您在您的機器上“單獨”(又名:您不計劃共享主機),我可能會堅持使用好的 ol’mod_php。
如果您正在計劃多個網站,則需要檢查您的優先級:
- 安全高於性能:使用 suphp_worker。兩者(worker MPM 和 suPHP)都經過了廣泛的測試,並為您提供了一個良好的安全起點。靜態文件的性能應該不錯,PHP 則不然。
- 性能優於安全性:可能是 mod_php_ruid2,但這只是因為我對 ITK 的體驗不好
我更喜歡使用第三種選項,它使用 FastCGI,為您提供更多分離權限和訪問權限的可能性 - 但似乎沒有提供。