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服務器再把結果返回給瀏覽器。php
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,全部這些都只在進程啓動時發生一次。html
PHP-CGI是PHP的解釋器,是PHP自帶的FastCGI管理器。不支持平滑重啓瀏覽器
PHP-FPM調用PHP解釋器(PHP-CGI)進程來處理請求,實現了Fastcgi協議,已被PHP官方收錄
PHP-FPM控制的進程cpu回收的速度比較慢,內存分配均勻,有效控制內存和進程
PHP-FPM的配置在php-fpm.ini文件裏,能夠經過php/sbin/php-fpm進行啓動、關閉,支持平滑重啓,在./configure的時候帶–enable-fpm參數便可開啓PHP-FPM服務器