CGI 和 FastCGI 協議的執行原理

2021-09-28 18:30:02 字數 2704 閱讀 2486

在用php開發的過程中,我們常常使用nginx或者apache作為我們的web伺服器。但是php是如何與這些web伺服器通訊的呢?

要談fastcgi就必須先說說cgi。那什麼是cgi?

cgi協議同 http 協議一樣是乙個「應用層」協議,它的 功能 是為了解決 web 伺服器與 php 應用(或其他 web 應用)之間的通訊問題。

既然它是乙個「協議」,換言之它與語言無關,即只要是實現類 cgi 協議的應用就能夠實現相互的通訊。

我們已經知道了 cgi 協議是為了完成 web 伺服器和應用之間進行資料通訊這個問題。那麼,這一節我們就來看看究竟它們之間是如何進行通訊的。

簡單來講 cgi 協議它描述了 web 伺服器和應用程式之間進行資料傳輸的格式,並且只要我們的程式語言支援標準輸入(stdin)、標準輸出(stdout)以及環境變數等處理,你就可以使用它來編寫乙個 cgi 程式。

一句話就是 web 伺服器中的 cgi 程序將接收到的 http 請求資料讀取到環境變數中,通過標準輸入**給 php 的 cgi 程式;當 php 程式處理完成後,web 伺服器中的 cgi 程序從標準輸出中讀取返回資料,並轉換回 http 響應訊息格式,最終將頁面呈獻給使用者。然後 web 伺服器關閉掉這個 cgi 程序。

可以說 cgi 協議特別擅長處理 web 伺服器和 web 應用的通訊問題。然而,它有乙個嚴重缺陷,對於每個請求都需要重新 fork 出乙個 cgi 程序,處理完成後立即關閉。

從功能上來講,cgi協議已經完全能夠解決 web 伺服器與 web 應用之間的資料通訊問題。但是由於每個請求都需要重新 fork 出 cgi 子程序導致效能堪憂,所以基於cgi協議的基礎上做了改進便有了fastcgi協議,它是一種常駐型的 cgi 協議。

本質上來將 fastcgi 和 cgi 協議幾乎完全一樣,它們都可以從 web 伺服器裡接收到相同的資料,不同之處在於採取了不同的通訊方式。

再來回顧一下 cgi 協議每次接收到 http 請求時,都需要經歷 fork 出 cgi 子程序、執行處理並銷毀 cgi 子程序這一系列工作。

fastcgi協議採用程序間通訊(ipc)來處理使用者的請求,下面我們就來看看它的執行原理。

如果僅僅因為工作模式的不同,似乎並沒有什麼大不了的。並沒到非要選擇 fastcgi 協議不可的地步。

然而,對於這個看似微小的差異,但意義非凡,最終的結果是實現出來的 web 應用架構上的差異。

在 cgi 協議中,web 應用的生命週期完全依賴於 http 請求的宣告週期。

對每個接收到的 http 請求,都需要重啟乙個 cgi 程序來進行處理,處理完成後必須關閉 cgi 程序,才能達到通知 web 伺服器本次 http 請求處理完成的目的。

但是在 fastcgi 中完全不一樣。

fastcgi 程序是常駐型的,一旦啟動就可以處理所有的 http 請求,而無需直接退出。

通過前面的講解,我們相比已經可以很準確的說出來fastcgi 是一種通訊協議這樣的結論。現在,我們就將關注的焦點挪到協議本身,來看看這個協議的定義。

同 http 協議一樣,fastcgi 協議也是有訊息頭和訊息體組成。

訊息頭資訊

主要的訊息頭資訊如下:

訊息型別定義如果是每個連線僅處理乙個請求,傳送 requestid 則略顯多餘。

但是我們的 web 伺服器和 fastcgi 程序之間的連線可能處理多個請求,即乙個連線可以處理多個請求。所以才需要採用資料報協議而不是直接使用單個資料流的原因:以實現「多路復用」。

因此,由於每個資料報都包含唯一的 requestid,所以 web 伺服器才能在乙個連線上傳送任意數量的請求,並且 fastcgi 程序也能夠從乙個連線上接收到任意數量的請求資料報。

另外我們還需要明確一點就是 web 伺服器 與 fastcgi 程序間通訊是 無序的。即使我們在互動過程中看起來乙個請求是有序的,但是我們的 web 伺服器也有可能在同一時間發出幾十個 begin_request 型別的資料報,以此類推。

php-fpm即php-fastcgi process manager.

php-fpm是fastcgi的實現,並提供了程序管理的功能。

程序包含 master 程序和 worker 程序兩種程序。

master 程序只有乙個,負責監聽埠,接收來自 web server 的請求,而 worker 程序則一般有多個(具體數量根據實際需要配置),每個程序內部都嵌入了乙個 php 直譯器,是 php **真正執行的地方。

php-fpm 是 fastcgi 程序管理器(php fastcgi process manager),用於替換 php 核心的 fastcgi 的大部分附加功能(或者說一種替代的 php fastcgi 實現),對於高負載**是非常有用的。

php-fpm如何工作的?

php-fpm 程序管理器有兩種程序組成,乙個 master 程序和多個 worker 程序。master 程序負責監聽埠,接收來自 web 伺服器的請求,然後指派具體的 worker 程序處理請求;worker 程序則一般有多個 (依據配置決定程序數),每個程序內部都嵌入了乙個 php 直譯器,用來執行 php **。

nginx 伺服器如何與 fastcgi 協同工作

nginx 伺服器無法直接與 fastcgi 伺服器進行通訊,需要啟用 ngx_http_fastcgi_module 模組進行**配置,才能將請求傳送給 fastcgi 服務。

CGI 和 FastCGI 協議的執行原理

目錄深入fastcgi協議 web 伺服器和 fastcgi 互動過程 為什麼需要在訊息頭髮送 requestid 這個標識?php fpm 在用php開發的過程中,我們常常使用nginx或者apache作為我們的web伺服器。但是php是如何與這些web伺服器通訊的呢?要談fastcgi就必須先說...

FastCgi 和Cgi的區別

cgi 1.fork and excute 每次來乙個請求,就fork出去乙個子程序,結束之後再關閉。來新請求還要重新fork子程序。fastcgi 可以理解為常駐型的cgi。使用了程序 執行緒池的概念 master程序,和眾多worker程序 每次來乙個請求時,只需要將socket長連線 包含環境...

cgi與fastcgi的區別

工作的原理 每當客戶請求cgi的時候,web伺服器就請求作業系統生成乙個 fork 新的cgi直譯器程序 如php cgi.exe 當cgi滿足要求後,web伺服器就殺死這個程序 概念 fastcgi是用來提高cgi程式效能的。類似於cgi,fastcgi也可以說是一種協議 工作原理 web ser...