理解 cgi fastcgi php-cgi php-fpm 之間的概念

CGI(Common Gateway Interface)

  • 中文名:公共網關接口

  • 定義:CGI 是Web 服務器運行時外部程序的規范,按CGI 編寫的程序可以擴展服務器功能。(CGI描述了服務器和請求處理程序之間傳輸數據的一種標準。)

  • 功能:可以讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的程序請求數據。

編程語言Perl是一個廣泛被用來編寫CGI程序的語言,但CGI的一個目的是要獨立于任何語言的。事實上,CGI程序可以用任何腳本語言或者是完全獨立編程語言實現,只要這個語言可以在這個系統上運行。

  • 工作方式:
    1、使用你的瀏覽器訪問URL并連接到HTTP web 服務器。
    2、Web服務器接收到請求信息后會解析URL,并查找訪問的文件在服務器上是否存在,如果存在返回文件的內容,否則返回錯誤信息。
    3、瀏覽器從服務器上接收信息,并顯示接收的文件或者錯誤信息。

  • 架構圖 :


    架構圖
  • 區別 CGI 和 CGI程序
    CGI 是一種規范/協議, CGI程序是使用 CGI 規范編寫出來的程序,例如(PHP解析器等)。

自己理解:
CGI 就是一種規范,它是用來規定web服務器和CGI程序(PHP解析器或者其他程序)交互時候的數據格式!
例如 用戶通過瀏覽器訪問頁面的時候,那么這時候web服務( Nginx)就會根據url去找到指定的頁面,頁面如果是靜態頁面(index.html)則會直接解析。如果頁面是動態頁面(index.php),web服務就會去調用CGI程序(PHP解析器)來處理,這時候就需要傳遞參數給這個CGI程序(PHP解析器)如 url地址 、http header、POST/GET參數等,CGI就是規定要傳送的這些數據和格式。

FastCGI(Fast Common Gateway Interface)

  • 中文名: 快速通用網關接口。

  • 定義:FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中并因此獲得較高的性能

如CGI,FastCGI也具有語言無關性。

  • 功能:FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活后,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分布式的運算, 即 FastCGI 程序可以在網站服務器以外的主機上執行并且接受來自其它網站服務器來的請求。

fork-and-execute 模式:CGI方式在遇到連接請求(用戶請求)先要創建cgi的子進程,激活一個CGI進程,然后處理請求,處理完后結束這個子進程。

  • 工作方式:首先,Fastcgi會先啟一個master,解析配置文件,初始化執行環境,然后再啟動多個worker。當請求過來時,master會傳遞給一個worker,然后立即可以接受下一個請求。這樣就避免了重復的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閑worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是fastcgi的對進程的管理。

簡單點理解:FastCGI是將多個CGI解釋器進程(多個php-cgi)長時間保持在內存中的進程管理器。因為CGI的啟動很慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴展并重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。

PHP-CGI

PHP-CGI就是PHP實現的自帶的FastCGI管理器。

但是這東西又缺點:
1.php-cgi變更php.ini配置后需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟。
2.直接殺死php-cgi進程,php就不能運行了。

PHP-FPM

php-fpm的管理對象是php-cgi,但不能說php-fpm是FastCGI進程的管理器,因為前面說了FastCGI是個協議,似乎沒有這么個進程存在,就算存在php-fpm也管理不了他(至少目前是)。他負責管理一個進程池,來處理來自Web服務器的請求。
對于php.ini文件的修改,php-cgi進程是沒辦法平滑重啟的,有了php-fpm后,就把平滑重啟成為了一種可能,php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,通過這種機制來平滑過度的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。