CGI(通用閘道器介面,Common Gateway Interface)

CGI是Web伺服器與請求處理程式之間傳輸資料的一種標準,保證Web伺服器傳遞過來的資料是標準格式的,其程式須執行在網路伺服器上。
CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。
工作原理:
每當客戶請求CGI的時候,WEB伺服器就請求作業系統生成一個新的CGI直譯器程序(如:PHP-CGI),當CGI滿足要求後,WEB伺服器就殺死這個程序。
Web伺服器(如:Nginx)只是內容的分發者,如果請求/index.html,Web伺服器會去檔案系統中找到這個檔案,傳送給瀏覽器,這裡分發的是靜態資料。
如果現在請求的是/index.php,根據配置檔案,Nginx知道這個不是靜態檔案,他會把這個請求簡單處理後交給PHP直譯器。
Nginx會傳哪些資料給PHP直譯器呢?url,查詢字串,POST資料,HTTP header等,CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協議。
當Web伺服器收到/index.php這個請求後,會啟動對應的CGI程式,這裡就是PHP的直譯器。
接下來PHP直譯器會解析php.ini檔案,初始化執行環境,然後處理請求,再以規定CGI規定的格式返回處理後的結果,退出程序。Web伺服器再把結果返回給瀏覽器。

FastCGI(快速通用閘道器介面,Fast Common Gateway Interface)

FastCGI是Web伺服器與請求處理程式之間傳輸資料的一種標準,是CGI的增強版本,用來減少網頁伺服器與CGI程式之間互動的開銷,從而使伺服器可以同時處理更多的網頁請求。
FastCGI像是一個常駐(long-live)型的CGI,只要啟用後,它可以一直執行著。
FastCGI支援分散式的運算,程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,其主要行為是將CGI直譯器程序保持在記憶體中並提供良好的效能、伸縮性、 Fail-Over特性等等。
FastCGI在程序中的應用程式,不依賴於任何Web伺服器的內部架構,獨立於核心Web伺服器執行,即使伺服器技術的變化,FastCGI依然穩定不變。
工作原理:
Web伺服器啟動時載入FastCGI程序管理器(如:Apache Module)
FastCGI程序管理器自身初始化,啟動多個CGI直譯器程序(多個php-cgi)並等待來自Web伺服器的連線
當客戶端請求到達Web伺服器時,FastCGI程序管理器選擇並連線到一個CGI直譯器。Web伺服器將CGI環境變數和標準輸入傳送到FastCGI子程序php-cgi。
FastCGI子程序完成處理後將標準輸出和錯誤資訊從同一連線返回Web伺服器。當FastCGI子程序關閉連線時,請求便告處理完成。FastCGI子程序接著等待並處理來自FastCGI程序管理器(執行在Web伺服器中)的下一個連線。在CGI模式中,php-cgi在此便退出了。
在上述情況中,你可以想象CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴充套件並重初始化全部資料結構。
使用FastCGI,所有這些都只在程序啟動時發生一次。

PHP-CGI(PHP通用閘道器介面,FastCGI Process Manager)

PHP-CGI是PHP的直譯器,是PHP自帶的FastCGI管理器。不支援平滑重啟

PHP-FPM(PHP Fastcgi程序管理器,FastCGI Process Manager)

PHP-FPM呼叫PHP直譯器(PHP-CGI)程序來處理請求,實現了Fastcgi協議,已被PHP官方收錄
PHP-FPM控制的程序cpu回收的速度比較慢,記憶體分配均勻,有效控制記憶體和程序
PHP-FPM的配置在php-fpm.ini檔案裡,可以通過php/sbin/php-fpm進行啟動、關閉,支援平滑重啟,在./configure的時候帶–enable-fpm引數即可開啟PHP-FPM

參考資料:
http://www.nowamagic.net/librarys/veda/detail/1319
https://segmentfault.com/q/1010000000256516