CGI(Common Gateway Interface)php
CGI 是Web 服務器運行時外部程序的規範,按CGI 編寫的程序能夠擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可經過數據庫API 與數據庫服務器等外部數據源進行通訊,從數據庫服務器中獲取數據。格式化爲HTML文檔後,發送給瀏覽器,也能夠將從瀏覽器得到的數據放到數據庫中。幾乎全部服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分爲標準CGI 和間接CGI兩種。標準CGI 使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通訊採用標準輸入輸出方式。間接CGI 又稱緩衝CGI,在CGI 程序和CGI 接口之間插入一個緩衝程序,緩衝程序與CGI 接口間用標準輸入輸出進行通訊nginx
FastCGI
FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。它還支持分佈式的運算, 即 FastCGI 程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail- Over特性等等。web
php-fpm
php-fpm是常和nginx搭配使用的程序,php-fpm實際上就是對FASTCGI協議的一個增強實現,已經被歸入PHP內核,能夠經過--enable-fpm編譯選項來啓用,php-fpm支持配置的平滑變動(經過fork新的worker進程),性能好,內存使用效率高,這也是爲何nginx+php-fpm的配置組合會替代apache+mod_cgi以及apache+mod_php的重要緣由數據庫
關係
CGI針對每一個http請求都是fork一個新進程來進行處理,處理過程包括解析php.ini文件,初始化執行環境等,而後這個進程會把處理完的數據返回給web服務器,最後web服務器把內容發送給用戶,剛纔fork的進程也隨之退出。 若是下次用戶還請求動態資源,那麼web服務器又再次fork一個新進程,周而復始的進行。
而Fastcgi則會先fork一個master,解析配置文件,初始化執行環境,而後再fork多個worker。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。這樣就避免了重複的勞動,效率天然是高。並且當worker不夠用時,master能夠根據配置預先啓動幾個worker等着;固然空閒worker太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是Fastcgi的對進程的管理。大多數Fastcgi實現都會維護一個進程池。
cgi、fastcgi 一般指 Web 服務器與解釋器通訊的協議規範,而 php-fpm 是 fastcgi 協議的一個實現apache
瀏覽器-> nginx -> php-fpm(master) ->php-fpm(worker 內有php解釋器)-> nginx ->瀏覽器瀏覽器