CGI,FastCGI,PHP-FPM
CGI(Common Gateway Interface)
CGI 是Web 服務器運行時外部程序的規範,按CGI 編寫的程序可以擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可通過數據庫API 與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔後,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分為標準CGI 和間接CGI兩種。標準CGI 使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信采用標準輸入輸出方式。間接CGI 又稱緩沖CGI,在CGI 程序和CGI 接口之間插入一個緩沖程序,緩沖程序與CGI 接口間用標準輸入輸出進行通信
FastCGI
FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分布式的運算, 即 FastCGI 程序可以在網站服務器以外的主機上執行並且接受來自其它網站服務器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中並因此獲得較高的性能。眾所周知,CGI解釋器的反復加載是CGI性能低下的主要原因,如果CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則可以提供良好的性能、伸縮性、Fail- Over特性等等。
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 協議的一個實現
瀏覽器-> nginx -> php-fpm(master) ->php-fpm(worker 內有php解釋器)-> nginx ->瀏覽器
CGI,FastCGI,PHP-FPM