《PHP - CGI/Fastcgi/PHP-FPM》

先說下我最近看到的一篇文章,哈哈哈,特別好玩。php

一步步教你編寫不可維護的 PHP 代碼html

 

以前一直知道 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也管理不了他(至少目前是).

  

參考:

  搞不清FastCgi與PHP-fpm之間是個什麼樣的關係

相關文章
相關標籤/搜索