關於本篇文章的部分糾正,請參考這篇文章:http://www.cppblog.com/woaido...php
CGI是一個web server與cgi程序(這裏能夠理解爲是php解釋器)之間進行數據傳輸的協議,保證了傳遞的是標準數據。html
php-cgi是php解釋器,就是上文提到的cgi程序。web
Fastcgi是用來提升cgi程序(php-cgi)性能的方案/協議。segmentfault
cgi程序的性能問題在哪呢?"PHP解析器會解析php.ini文件,初始化執行環境",就是這裏了。標準的CGI對每一個請求都會執行這些步驟,因此處理的時間會比較長。服務器
Fastcgi會先啓一個master進程,解析配置文件,初始化執行環境,而後再啓動多個worker進程。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。這樣就避免了重複勞動,效率天然提升。並且當worker不夠用時,master能夠根據配置預先啓動幾個worker等着;固然空閒worker太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是Fastcgi的對進程的管理。多線程
上文提到了Fastcgi只是一個方案或者協議,那麼php-fpm就是這個實現了Fastcgi的程序,也就是說,上文所描述的進程分配和管理是FPM來作的。官方對FPM的解釋是 Fastcgi Process Manager(Fastcgi 進程管理器)。併發
PHP從代碼級別來說不支持多線程操做,不能像Java、C#等語言同樣能夠編寫多線程代碼。但多線程和併發沒有直接關係,多線程只是代碼被運行時在同一時間同時執行多個線程任務,來提升服務器CPU的利用率,提升代碼效率。但php是能夠多進程執行的,上文所述的FPM進程管理機制就是多進程單線程的,有效提升了併發訪問的響應效率。高併發
參考連接:php-fpm