Web Server(Apache/Nginx/IIS)只是內容的分發者。好比,若是請求/index.html
,那麼web server
會去文件系統中找到這個文件,發送給瀏覽器,這裏分發的是靜態數據。好了,若是如今請求的是/index.php
,根據配置文件,Nginx
知道這個不是靜態文件,須要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。Nginx
會傳哪些數據給PHP解析器
呢?url
要有吧,查詢字符串也得有吧,POST
數據也要有,HTTP header
等信息。php
CGI
就是規定要傳哪些數據、以什麼樣的格式傳遞給後方處理這個請求的協議
。
當webserver
收到/index.php
這個請求後,會啓動對應的CGI
程序,這裏就是PHP的解析器
。接下來PHP
解析器會解析php.ini
文件,初始化執行環境,而後處理請求,再以規定CGI
規定的格式返回處理後的結果,退出進程。webserver
再把結果返回給瀏覽器。html
好了,CGI
是個協議,跟進程什麼的不要緊。web
那FastCGI
又是什麼呢?FastCGI
是用來提升CGI
程序性能的。
那麼CGI
程序的性能問題在哪呢?segmentfault
PHP解析器會解析php.ini文件,初始化執行環境
就是這裏了。標準的CGI
對每一個請求都會執行這些步驟
(不閒累啊!啓動進程很累的說!),因此處理每一個時間的時間會比較長。這明顯不合理嘛!瀏覽器
那麼FastCGI
是怎麼作的呢?首先,FastCGI
會先啓一個master
,解析配置文件,初始化執行環境,而後再啓動多個worker
。當請求過來時,master
會傳遞給一個worker
,而後當即能夠接受下一個請求。這樣就避免了重複的勞動,效率天然是高。並且當worker
不夠用時,master
能夠根據配置預先啓動幾個worker
等着;固然空閒worker
太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是FastCGI
的對進程的管理。
好了,FastCGI
是CGI
的升級版,一種語言無關的協議,用來溝通程序(如PHP, Python, Java
)和Web
服務器(Apache
, Nginx
,IIS
), 理論上任何語言編寫的程序均可以經過FastCGI
來提供Web
服務。 FastCGI
的特色是會在一個進程中依次完成多個請求,以達到提升效率的目的,大多數FastCGI
實現都會維護一個進程池。安全
那PHP-FPM
又是什麼呢?是一個實現了FastCGI
的程序,被PHP
官方收了。
你們都知道,PHP的解釋器是php-cgi。php-cgi只是個CGI程序,他本身自己只能解析請求,返回結果,不會進程管理(皇上,臣妾真的作不到啊!)因此就出現了一些可以調度php-cgi進程的程序,好比說由lighthttpd
分離出來的spawn-fcgi
。好了PHP-FPM
也是這麼個東東,在長時間的發展後,逐漸獲得了你們的承認(要知道,前幾年你們但是抱怨PHP-FPM
穩定性太差的),也愈來愈流行。服務器
好了,PHP-FPM
就是針對於PHP
的,FastCGI
的一種實現,他負責管理一個進程池,來處理來自Web
服務器的請求。目前,PHP-fpm
是內置於PHP
的。
可是PHP-fpm
僅僅是個「PHP Fastcgi
進程管理器」, 它仍會調用PHP
解釋器自己來處理請求,PHP
解釋器(在Windows
下)就是php-cgi.exe
.php-fpm
網上有的說,fastcgi
是一個協議,php-fpm
實現了這個協議性能
對。
有的說,php-fpm
是fastcgi
進程的管理器,用來管理fastcgi
進程的對。
php-fpm的管理對象是php-cgi。但不能說php-fpm是fastcgi進程的管理器,由於前面說了fastcgi是個協議
,彷佛沒有這麼個進程存在,就算存在php-fpm也管理不了他(至少目前是)。url
有的說,php-fpm
是php
內核的一個補丁
之前是對的。由於最開始的時候php-fpm
沒有包含在PHP
內核裏面,要使用這個功能,須要找到與源碼版本相同的php-fpm
對內核打補丁,而後再編譯。後來PHP
內核集成了PHP-FPM
以後就方便多了,使用--enalbe-fpm
這個編譯參數便可。
有的說,修改了php.ini
配置文件後,沒辦法平滑重啓,因此就誕生了php-fpm
是的,修改php.ini
以後,php-cgi
進程的確是沒辦法平滑重啓的。php-fpm
對此的處理機制是新的worker
用新的配置,已經存在的worker
處理完手上的活就能夠歇着了,經過這種機制來平滑過分。
還有的說PHP-CGI
是PHP
自帶的FastCGI
管理器,那這樣的話幹嘛又弄個php-fpm
不對。php-cgi
只是解釋PHP
腳本的程序而已。
你(PHP
)去和愛斯基摩人(web
服務器,如 Apache
、Nginx
)談生意你說中文(PHP
代碼),他說愛斯基摩語(C
代碼),互相聽不懂,怎麼辦?那就都把各自說的話轉換成英語(FastCGI
協議)吧。
怎麼轉換呢?你就要使用一個翻譯機(PHP-FPM
) (固然對方也有一個翻譯機,那個是他自帶的)。PHP的解釋器是php-cgi。php-cgi只是個CGI程序,他本身自己只能解析請求,返回結果,不會進程管理(皇上,臣妾真的作不到啊!)因此就出現了一些可以調度php-cgi進程的程序,好比說由lighthttpd
分離出來的spawn-fcgi
。好了PHP-FPM
也是這麼個東東
咱們這個翻譯機是最新型的,老式的那個(PHP-CGI
)被淘汰了。不過它(PHP-FPM
)只有年輕人(Linux
系統)會用,老頭子們(Windows
系統)不會擺弄它,只好繼續用老式的那個。
通信協議
,是WebSever(Apache/Nginx/IIS)與其它程序(此程序一般叫作CGI程序,如PHP腳本解析器)之間通信的橋樑。FastCGI
是CGI
的改良進化版,FastCGI
相比CGI
更安全、性能更好,因此如今都是使用FastCGI
協議進行通信。PHP-CGI
和PHP-FPM
都是程序,是具體實現WEB容器和PHP語言之間解析請求,返回結果的程序。推薦文檔:Nginx、CGI、FastCGI、PHP-CGI、PHP-FPM處理流程
推薦文檔2:cgi php-cgi,PHP底層原理
參考文檔:CGI、FastCGI、PHP-CGI、PHP-FPM我的理解
參考文檔2:搞不清FastCgi與PHP-fpm之間是個什麼樣的關係