目錄
基礎
Module方式
CGI
FastCGI介紹
FastCGI簡單介紹
FastCGI的工作原理
PHP-FPM介紹
總結
首頁 後端開發 php教程 CGI、FastCGI和PHP-FPM關係圖解

CGI、FastCGI和PHP-FPM關係圖解

Apr 16, 2018 pm 01:55 PM
fastcgi php php-fpm

這篇文章主要介紹的內容是關於CGI、FastCGI和PHP-FPM關係圖解,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下


目錄

  • 基礎

  • #Module方式

  • CGI

  • FastCGI介紹

    • FastCGI簡單介紹

    • FastCGI的工作原理

  • #PHP-FPM介紹

  • 總結

  • 參考資料

#在搭建LAMP/LNMP 伺服器時,會常常遇到 PHP-FPM、FastCGI和CGI 這幾個概念。如果對它們一知半解,很難搭建高效能的伺服器。接下來我們就以圖形方式,解釋這些概念之間的關係。

基礎

在整個網站架構中,Web Server(如Apache)只是內容的分發者。舉個栗子,如果客戶端請求的是 index.html,那麼Web Server會去檔案系統中找到這個文件,發送給瀏覽器,這裡分發的是靜態資料。

如果請求的是index.php,根據設定文件,Web Server知道這個不是靜態文件,需要去找PHP 解析器來處理,那麼他會把這個請求簡單處理,然後交給PHP解析器。

當Web Server收到 index.php 這個請求後,就會啟動對應的 CGI 程序,這裡就是PHP的解析器。接下來PHP解析器會解析php.ini文件,初始化執行環境,然後處理請求,再以規定CGI規定的格式傳回處理後的結果,退出進程,Web server再把結果回傳給瀏覽器。這就是一個完整的動態PHP Web存取流程,接下來再引出這些概念,就好理解多了,

  • #CGI:#是Web Server 與Web Application 之間資料交換的一種協定。

  • FastCGI:同 CGI,是一種通訊協議,但比 CGI 在效率上做了一些最佳化。同樣,SCGI 協定與 FastCGI 類似。

  • PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI 協定的介面程式。

  • PHP-FPM:是PHP(Web Application)對Web Server 提供的FastCGI 協定的介面程序,額外也提供了相對智能一些任務管理。

WEB 中,

  • Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等伺服器,

  • #Web Application 一般指PHP、Java、Asp.net等應用程式。

Module方式

在了解 CGI 之前,我們先來了解Web server 傳遞資料的另一個方法:PHP Module載入方式。以Apache 為例,在PHP Module方式中,是不是在Apache 的設定檔httpd.conf 中加上這樣幾句:

# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module>
    DirectoryIndex index.php index.html</IfModule>
登入後複製

上面是Windows 下安裝php和apache環境後手動配置,在linux下原始碼安裝大致上是這樣配置的:

# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
登入後複製

所以,這種方式,他們的共同本質都是用LoadModule 來載入php5_module,就是把php當作apache的子模組來運行。當透過web存取php檔案時,apache就會呼叫php5_module來解析php程式碼。

那麼php5_module是怎麼來將資料傳給php解析器來解析php程式碼的呢?答案是透過sapi。

我們再來看一張圖,詳細的說說apache 與php 與sapi的關係:

CGI、FastCGI和PHP-FPM關係圖解

從上面圖中,我們看出了sapi就是這樣的一個中間過程,SAPI提供了一個和外部通訊的接口,有點類似於socket,使得PHP可以和其他應用進行交互資料(apache,nginx等)。 php預設提供了許多種SAPI,常見的提供給apache和nginx的php5_module、CGI、FastCGI,給IIS的ISAPI,以及Shell的CLI。

所以,以上的apache呼叫php執行的過程如下:

apache -> httpd -> php5_module -> sapi -> php
登入後複製

好了。 apache與php透過php5_module的方式就搞清楚了吧!

這種模式將php模組安裝到apache中,所以每次apache結束請求,都會產生一條進程,這個進程就完整的包括php的各種運算計算等操作。

在上圖中,我們很清楚的可以看到,apache每接收一個請求,都會產生一個進程來連接php透過sapi來完成請求,可想而知,如果一旦用戶過多,並發數過多,伺服器就會承受不住了。

而且,把mod_php編進apache時,出問題時很難定位是php的問題還是apache的問題。

CGI

CGI(Common Gateway Interface)全名為“通用網關介面”,WEB 伺服器與PHP應用進行「交談」的一種工具,其程式必須運行在網路伺服器上。 CGI可以用任何一種語言來寫,只要這種語言有標準輸入、輸出和環境變數。如php、perl、tcl等。

WEB伺服器會傳哪些資料給PHP解析器呢? URL、查詢字串、POST資料、HTTP header都會有。所以,CGI就是規定要傳哪些數據,以什麼樣的格式傳遞給後方處理這個請求的協定。仔細想想,你在PHP程式碼中使用的使用者從哪裡來的。

也就是說,CGI就是專門用來和 web 伺服器打交道的。 web伺服器收到使用者請求,就會把請求提交給cgi程式(如php-cgi),cgi程式根據請求提交的參數作應處理(解析php),然後輸出標準的html語句,傳回給web服伺服器, WEB伺服器再回傳給客戶端,這就是普通cgi的工作原理。

CGI的好處就是完全獨立於任何伺服器,只是做為中間分子。提供介面給apache和php。他們透過cgi搭線來完成資料傳遞。這樣做的好處了盡量減少2個的關聯,使他們2變得更獨立。

但是CGI有個蛋痛的地方,就是每一次web請求都會有啟動和退出過程,也就是最為人詬病的fork-and-execute模式,這樣一在大規模並發下,就死翹翹了。

FastCGI介紹

FastCGI簡單介紹

從根本上來說,FastCGI是用來提升CGI程式效能的。類似CGI,FastCGI也可以說是一種協定

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要啟動後,不會每次都要花費時間去fork一次。它還支援分散式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行,並且接受來自其它網站伺服器來的請求。

FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在記憶體中,並因此獲得較高的效能。眾所周知,CGI解釋器的反覆載入是CGI效能低下的主要原因,如果CGI解釋器保持在記憶體中,並接受FastCGI進程管理器調度,則可以提供良好的效能、伸縮性、Fail- Over特性等等。

FastCGI的工作原理

FastCGI介面方式採用C/S結構,可以將HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或多個腳本解析守護程式。當HTTP伺服器每次遇到動態程式時,可以直接交付給FastCGI進程來執行,然後將得到的結果傳回瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求,或將動態腳本伺服器的結果傳回給客戶端,這在很大程度上提高了整個應用系統的效能。

CGI、FastCGI和PHP-FPM關係圖解

  1. Web Server啟動時載入FastCGI進程管理器(Apache Module或IIS ISAPI等)

  2. #FastCGI進程管理器本身初始化,啟動多個CGI解釋器進程(可建置多個php-cgi),並等待來自Web Server的連線。

  3. 當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連線到一個CGI解釋器。 Web server將CGI環境變數和標準輸入傳送到FastCGI子進程php-cgi。

  4. FastCGI子進程完成處理後,將標準輸出和錯誤訊息從相同連線返回Web Server。當FastCGI子程序關閉連線時,請求便告處理完成。 FastCGI子進程接著等待,並處理來自FastCGI進程管理器(運行在Web Server中)的下一個連線。在CGI模式中,php-cgi在此便退出了。

FastCGI與CGI特性:

  1. #對CGI來說,每個Web請求PHP都必須重新解析php.ini、重新載入全部擴展,並重新初始化全部資料結構。而使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連線(Persistent database connection)可以運作。

  2. 由於FastCGI是多進程,所以比CGI多執行緒消耗更多的伺服器內存,php-cgi解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的記憶體數。

PHP-FPM介紹

要了解PHP-FPM,就得先說說PHP-CGI。

PHP-CGI就是PHP實作的自帶的FastCGI管理器。雖然是php官方出品,但是這丫的卻一點也不給力,性能太差,而且也很麻煩不人性化,主要體現在:

  1. php-cgi變更php. ini配置後,需重新啟動php-cgi才能讓新的php-ini生效,不可以平滑重啟。

  2. 直接殺死php-cgi進程,php就不能運作了。

上面2個問題,一直讓很多人病垢了很久,所以很多人還是在用 Module 方式。直到2004年一個叫Andrei Nigmatulin的屌絲發明了PHP-FPM ,這神器的出現就徹底打破了這種局面,這是一個PHP專用的CGI、FastCGI和PHP-FPM關係圖解 管理器,它很爽的克服了上面2個問題,而且,也表現在其他方面更表現強勁。

也就是說,PHP-FPM 是對於 FastCGI 協定的具體實現,他負責管理一個進程池,來處理來自Web伺服器的請求。 目前,PHP5.3版本之後,PHP-FPM是內建於PHP的

因為PHP-CGI只是個CGI程序,他自己本身只能解析請求,回傳結果,不會進程管理。所以就出現了一些能夠調度 php-cgi 進程的程序,比如說由lighthttpd分離出來的spawn-fcgi。同樣,PHP-FPM也是用來調度管理PHP解析器php-cgi的管理程式。

PHP-FPM透過產生新的子程序可以實現php.ini修改後的平滑重啟。

總結

最後,我們來總結一下,這些技術經過不斷的升級,可以解決什麼問題(不然也不會升級嘛)。

所以,如果要建立一個高效能的PHP WEB伺服器,目前最佳的方式是Apache/Nginx FastCGI PHP-FPM( PHP-CGI)方式了,不要再使用Module載入或CGI 方式啦:)

這篇文章圖片用Vis​​io製作,原始檔案:php-fpm

原文網址:https://www.awaimai.com/371.html

相關推薦:

PHP7核心剖析1之CGI與FastCGI

#CGI、FastCGI 和PHP_FPM到底有什麼關係?

以上是CGI、FastCGI和PHP-FPM關係圖解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

See all articles