搜尋
首頁後端開發php教程CGI、FastCGI和PHP-FPM關係圖解

CGI、FastCGI和PHP-FPM關係圖解

Apr 16, 2018 pm 01:55 PM
fastcgiphpphp-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
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱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 Mac版

SublimeText3 Mac版

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

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具