身為 PHP 後端開發的程式猿,職業生涯中自然少不了接觸高可用相關的 Web 產品。對於初中級段位的 PHP 來說面試中談及高可用我們可能對伺服器叢集負載均衡,資料庫分庫分表,資料庫讀寫分離,快取叢集和訊息中介軟體比較熟悉。但是涉及到 CGI,FastCGI,PHP-FPM 好像就比較陌生。其實從我們開始使用 PHP 開發 Web 應用時,就已經和 CGI 打交道了。只是我們平常並沒有關注到 Web 伺服器和 PHP 應用之間的通訊方式,其實這些知識點很容易理解。但是如果對它們一知半解,就很難搭建出高效能的伺服器。
我們需要了解下 Nginx 和 PHP 是怎麼協作的,下面拿 Nginx 舉例。我們首先來認識下 CGI 和 FastCGI 這兩個協議,並關注它們之間的區別。
CGI
CGI全稱是“通用閘道器介面”(Common Gateway Interface),它可以讓一個客戶端,從網頁瀏覽器向執行在Web伺服器上的程式請求資料。 CGI描述了客戶端和這個程式之間傳輸資料的一種標準。 CGI的一個目的是要獨立於任何語言的,所以CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。 如php,perl,tcl等。
FastCGI :像是一個常駐(long-live)型的CGI:
FastCGI是Web伺服器和處理程式之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-lived)型的CGI, 它可以一直執行,在請求到達時不會花費時間去fork一個程式來處理(這是CGI最為人詬病的fork-and-execute模式)。 正是因為他只是一個通訊協議,它還支援分散式的運算,所以 FastCGI 程式可以在網站伺服器以外的主機上執行,並且可以接受來自其它網站伺服器的請求。
FastCGI 是與語言無關的、可伸縮架構的 CGI 開放擴充套件,將 CGI 直譯器程式保持在記憶體中,以此獲得較高的效能。 CGI 程式反覆載入是 CGI 效能低下的主要原因,如果 CGI 程式保持在記憶體中並接受 FastCGI 程式管理器排程, 則可以提供良好的效能、伸縮性、Fail-Over 特性等。
FASTCGI相對於CGI的優勢:
CGI直譯器的反覆載入是CGI效能低下的主要原因\
如果CGI直譯器保持在記憶體中並接受FastCGI程式管理器排程,則可以提供良好的效能、伸縮性、Fail- Over特性等等\
可以想象CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴充套件並重初始化全部資料結構。\
使用FastCGI,所有這些都只在程式啟動時發生一次。一個額外的好處是,可以持續資料庫連線工作
到這裡就對 CGI,和 FastCGI 有初步印象了吧。
PHP-FPM
Reference
深入剖析 Web 伺服器與 PHP 應用之間的通訊機制 – 掌握 CGI 和 FastCGI 協議的執行原理\
什麼是CGI FastCGI PHP-CGI PHP-FPM Spawn-CGI?它們之間的關係
CGI、FastCGI和PHP-FPM關係圖解\
注:此文對 PHP-CGI 的解釋可能有誤。