聊一聊CGI、FastCGI及FPM

CGI是什麼

CGI全稱通用網關接口。通用網關接口(Common Gateway Interface)是一種重要的互聯網技術,可讓一個客戶端,從網頁瀏覽器向服務器上的程序請求數據。CGI描述了服務器和請求處理程序之間傳輸數據的一種標準。— 維基百科php

說的簡單點,所謂CGI其實就是定義了服務器(如nginx)和處理程序(如PHP)之間該如何進行數據交互的標準。若是沒有這個標準,服務器按照本身的方式把數據傳給處理程序,那處理程序該如何識別,因此提供了一種各種服務器和各個處理程序都認同的的協議,規定了哪些數據該傳遞,以什麼樣的方式傳遞。nginx

那所謂的數據,又是什麼?web

這裏的數據我認爲應該分紅兩部分。第一部分是:服務器傳遞給處理程序,這個時候會傳遞如urlrequest bodyrequest header等信息,PHP解析器(php-cgi)拿到這些信息,進行程序內部的處理。第二部分是:處理程序把響應數據回傳給服務器,這個時候的數據就會是response等響應信息、服務器拿到數據後,經過cgi解析,處理完成後,返回給客戶端。瀏覽器

CGI就那麼完美嗎?服務器

答案固然是否認的,每一次的web請求,實現了CGI的進程都會fork一個進程進行處理,當請求處理完以後,就要關閉,這樣頻繁的對進程進行建立銷燬,效率低、處理速度慢,並且當鏈接數一多,過多的進程就會消耗更多的資源和內存。url

FastCGI是什麼

FastCGI從根本上來講其實相似於cgi,也是與語言無關的一種協議。是爲了解決cgi的頻繁建立銷燬形成的資源浪費、才孕育而生了FastCGI。code

FPM又是什麼

FPM或者說是PHP-FPM,官方對FPM的解釋是Fastcgi Process Manager(Fastcgi 進程管理器)。在說FPM以前就不得不先說一下,PHP官方推出的php-cgi.cdn

php-cgi雖然是官方出品,可是當修改php.ini文件後,須要重啓php-cgi,並且php-cgi不支持平滑重啓。blog

PHP-FPM是非官方出品的,是從php5.3以後加入的,它是對FastCGI協議的具體實現,負責一個進程池來管理web服務器的請求。接口

CGI、FastCGI、PHP-CGI和PHP-FPM關係圖

CGI、FastCGI、PHP-CGI和PHP-FPM關係圖

相關文章
相關標籤/搜索