先說下我最近看到的一篇文章,哈哈哈,特別好玩。php
以前一直知道 PHP 在 CGI 模式下運行。命令行下在 CLI 模式下運行。nginx
可是 FPM 和 nginx 配置 FastCGI 他們具體是什麼關係?還真的不太明白,今天來講下他們的關係。web
CGI 是幹什麼的?segmentfault
這得和咱們的一個請求的正常流程來看。瀏覽器
當一個請求來時,由 WebServer(nginx/Apache) 來對請求進行分發。服務器
若是請求的是 index.html 那麼服務器回去尋找對應的文件並返回該靜態資源。php-fpm
固然,這只是靜態資源。性能
當請求內容爲 index.php 時,WebServer 發現這並非一個靜態文件,以後會根據配置來尋找 PHP 解析器來處理這個請求。spa
找到 PHP 解析器以後,怎麼傳遞數據呢?必須使用你們都明白的的一個東西吧,就像 英語 -> 英語交流, 漢語->漢語交流,英語->漢語->沒法交流(不明白對方說的什麼);
CGI就是規定要傳哪些數據、以什麼樣的格式傳遞給後方處理這個請求的協議。仔細想一想,你在PHP代碼中全部的數據是怎麼來的?
因此,當收到 /index.php 這個請求後
1:會啓動CGI程序【PHP解釋器】。
2:以後CGI會啓動一個進程解析 php.ini ,初始環境,處理請求。
3:在已規定規定好的CGI格式返回給 WebServer 。
4:銷燬這個進程。
5:WebServer 在把結果返回給瀏覽器。
CGI是個協議,是爲了保證web server傳遞過來的數據是標準格式的
Fastcgi 是幹什麼的?
這裏就須要說一下 PHP-CGI 的缺點了,經過上面關於CGI的描述,發現 CGI 的特色
請求->啓動一個進程處理->處理完銷燬這個進程
CGI在請求時反覆加載,這也正是 CGI 性能低下的主要緣由,正是應爲這樣,纔有了Fastcgi。
定義:WEB服務器與處理程序之間通訊的一種協議,是CGI的改進方案。
不一樣【也能夠說是特色吧】:
1:fastcgi 是一個常駐型的CGI,能夠一直運行,在請求時,不會fock一個新的進程來處理。
2:CGI 解釋器進程在內存中保持,以此來得到更好的性能。
Fastcgi 工做流程:
1:在Web Server啓動時同時載入 Fastcgi 進程管理器
2:Fastcgi進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待WebServer的鏈接
3:當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。 Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
4:FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。
5: FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。在CGI模式中,php-cgi在此便退出了。
簡單來講:
好比我家要裝修,裝修材料不知道何時來。
CGI是:
裝修材料來->僱工人->幹活->解僱工人。
費時費力。
Fastcgi:
先僱幾個工人等着->無論何時材料來->幹活->繼續等着
總結:Fastcgi就是用來提升CGI程序性能的。
PHP-FPM 是幹什麼的?
Fastcgi 比 CGI 好用,咱們爲何不用,因而 被PHP官方收了。
你們都知道,PHP解釋器是PHP-CGI,可是PHP-CGI是個CGI程序,本身自己只能解析請求,並不能對進程進行管理。
因此就出現了一些能夠管理 PHP-CGI 進程的程序。
PHP-FPM 也就是這樣。
總結:php-fpm是fastcgi進程的管理器,用來管理fastcgi進程的
總結:
fastcgi是一個協議,php-fpm實現了這個協議。
php-fpm的管理對象是php-cgi。但不能說php-fpm是fastcgi進程的管理器,由於前面說了fastcgi是個協議,彷佛沒有這麼個進程存在,就算存在php-fpm也管理不了他(至少目前是).
參考: