Php

Fast-CGI、CGI、Mod-PHP、SuPHP、PHP-FPM 之間的區別和優勢

  • January 23, 2021

有幾個不同的 php“包裝器”(?)。它們之間有什麼區別?試圖Google一些,但似乎無法找到資訊。(mod-php 無法通過 Google 搜尋)。

為什麼我會選擇一個而不是另一個?

CGI 和 FastCGI 是兩種非 PHP 特有的協議:

  • CGI 腳本是一種在 HTTP 請求到達時執行伺服器端腳本(不僅僅是 PHP!)的方法。在此設置中,Web 伺服器為每個傳入請求啟動一個新的 CGI 程序,從而導致顯著的性能成本。
  • FastCGI是一種“更好的 CGI”——為了解決 CGI 的局限性,FastCGI 作為伺服器(TCP 或 UNIX)執行,因此可以跨請求重用資源。

啟用 PHP 的網路伺服器可以配置如下:

  • mod_php是一個執行 PHP 的 Apache 模組。在此設置中,PHP 請求在 Apache 程序下處理,並附帶所有相關內容:PHP 程序在 Apache 配置中定義,PHP 在 Apache 使用者和權限下執行等。
  • PHP-FPM是 PHP 的 FastCGI 實現。在此設置中,PHP-FPM 作為獨立的 FastCGI 伺服器執行,Apache 使用 FastCGI 模組連接到它,例如mod_fcgidmod_fastcgimod_proxy_fcgi(Apache 2.4+)。在這個配置中,權限、程序相關的東西和其他一切都由 PHP-FPM 伺服器控制。性能與mod_php.
  • SuPHP - 這用於解決mod_php與權限相關的一些缺點:mod_phpPHP 腳本在 Apache 使用者/組下執行,但mod_suphp可以以不同使用者身份執行腳本。suPHP 不再維護,不應使用。
  • CGI/FastCGI - 我根據評論中的問題添加了這個。在不知道設置細節的情況下,PHP 可以使用任何其他 FastCGI 實現作為 FastCGI 伺服器執行 - 如另一個問題中所述。我不使用此設置,也沒有看到比 PHP-FPM 有任何好處。
  • CGI - PHP 也可以作為優秀的 CGI 腳本執行,但我無法想像一個好的案例,除了與一些非常過時的環境兼容。

關於這些不同方法的優缺點,我只堅持mod_phpPHP-FPM,涵蓋兩個主要案例:

  • mod_php在某些 Docker 設置中可能很有用,在這些設置中,您希望傳遞執行支持 PHP 的 Web 伺服器的單個容器。一切都作為單個程序執行的事實使 Docker 容器配置更容易。另一方面,在帶有 web 伺服器的單個容器中執行 PHP-FPM 伺服器將需要使用supervisord、高級 bash 腳本或其他方法進行流程編排,這與編寫 Docker 容器的最佳實踐背道而馳。
  • PHP-FPM 是一種更強大的方法,可以更好地分離關注點,因此 PHP-FPM 伺服器可以獨立於 Web 伺服器進行配置、(性能)調整和維護。這也允許在池中或與 Web 伺服器不同的機器上執行 PHP-FPM 伺服器。如上所述,對於 Docker 容器,在這種情況下建議使用單獨的 PHP-FPM 和 webserver 容器,使配置更複雜(更強大)。PHP-FPM 方法也是使用nginx網路伺服器的唯一方法,因為它的 PHP 模組 AFAIK 不存在。

我的上述兩種方法的 Docker 實現可以在這裡找到:

該實現旨在與我的 Kubernetes 集群中的一些舊項目和新項目一起使用。隨意使用它。

所以,TLDR:

  • CGI、FastCGI 是協議;CGI 很慢,FastCGI 快得多
  • mod_php和 PHP-FPM 是執行 PHP 的兩種主要方式
  • mod_SuPHP是一種用於解決mod_php缺點的方法。它已經過時,應該改用 PHP-FPM。

引用自:https://serverfault.com/questions/645755