cgi web 調用多次啟動_全面了解CGI、FastCGI、PHPFPM

一、拋個磚

1、Web Server傳遞數據的方法

正式說CGI之前,先來了解一下Web Server傳遞數據的另外一種方法:PHP Module加載方式。相信都會想起Apache吧,初學php時,在windows上安裝完php和Apache之后,為了讓Apache能夠解析php代碼,我們會在Apache的配置文件(httpd.conf)中添加如下配置:

#添加下邊兩行LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下內容    DirectoryIndex index.php index.html

當在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三者之間的關系:?

2724f62d397c571216b9deac3f6f7d56.png

從上面圖中,我們看出了sapi就是這樣的一個中間過程,sapi提供了一個和外部通信的接口,使得PHP可以和其他應用進行交互數據(apache,nginx等)。php默認提供了很多種sapi,常見的提供給apache和nginx的php5_module、CGI、FastCGI,給IIS的ISAPI,以及Shell的CLI。(httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計為一個獨立運行的后臺進程,它會建立一個處理請求的子進程或線程池)

所以,以上的apache調用php執行的過程如下:

apache?->?httpd?->?php5_module?->?sapi?->?php

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

在上圖中,我們很清晰的可以看到,apache每接收一個請求,都會產生一個進程來連接php通過sapi來完成請求,可想而知,如果一旦用戶過多,并發數過多,服務器就會承受不住了。而且,把php當做一個模塊加載到apache中,出問題時很難定位是php的問題還是apache的問題。?

2、引出概念

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

73f4e1d428059220abd731ebd313d7d5.png

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

9f8bc139a1710ca07e96d9c671534019.png

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

CGI:是 Web Server 與 Web Application 之間數據交換的一種協議。

FastCGI:同 CGI,是一種通信協議,但比 CGI 在效率上做了一些優化。

PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI 協議的接口程序。

PHP-FPM:是 PHP(Web Application)對 Web Server 提供的 FastCGI 協議的接口程序,額外還提供了相對智能一些任務管理。

(Web Server 一般指Apache、Nginx、IIS、Tomcat等服務器,Web Application 一般指PHP、Java、Asp.net等應用程序)?

二、概念

1、CGI

CGI(Common Gateway Interface)全稱是“通用網關接口”,WEB 服務器與PHP應用進行“交談”的一種工具,其程序須運行在網絡服務器上。CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。如php、perl、tcl等。

WEB服務器會傳哪些數據給PHP解析器呢?URL、查詢字符串、POST數據、HTTP header都會有。所以,CGI就是規定要傳哪些數據,以什么樣的格式傳遞給后方處理這個請求的協議。也就是說,CGI就是專門用來和 web 服務器打交道的。web服務器收到用戶請求,就會把請求提交給cgi程序(如php-cgi),cgi程序根據請求提交的參數作應處理(解析php),然后輸出標準的html語句,返回給web服服務器,WEB服務器再返回給客戶端,這就是普通cgi的工作原理。(cgi程序,你就可以理解成遵循cgi協議編寫的程序)

優點:

CGI的好處就是完全獨立于任何服務器,僅僅是做為中間分子。提供接口給web服務器和web應用(如提nginx和php)。他們通過cgi搭線來完成數據傳遞。這樣做的好處了盡量減少2個的關聯,使他們2變得更獨立。

缺點:

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

2、FastCGI

從根本上來說,FastCGI是用來提高CGI程序性能的。類似于CGI,FastCGI也可以說是一種協議。

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活后,不會每次都要花費時間去fork一次。

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

舉例:

當web server收到/index.php請求,看一下CGI程序和FastCGI程序分別是怎么處理的:

CGI:當收到web server請求后,會啟動對應的CGI程序,這里就是PHP的解析器(php-cgi)。接下來PHP解析器會解析php.ini文件,初始化執行環境,然后處理請求,再以規定的CGI規定的格式返回處理后的結果,退出進程。(CGI每次接收到請求都會執行這些步驟)

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

FastCGI的工作原理:

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

629ec80bd9759c668f9b6333c8c6b2df.png

(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在此便退出了。

CGI與FastCGI比較:

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

(2)由于FastCGI是多進程,所以比CGI多線程消耗更多的服務器內存,php-cgi解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。?

3、PHP-FPM

首先要說的是:fastcgi是一個協議,php-fpm實現了這個協議。

大家都知道,PHP的解釋器是php-cgi。php-cgi只是個CGI程序,他自己本身只能解析請求,返回結果,不會進程管理,所以就出現了一些能夠調度php-cgi進程的程序,php-fpm就是這樣的一個東西。它克服了php-cgi變更php.ini配置后,需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟,直接殺死php-cgi進程,php就不能運行了的問題。修改php.ini之后,php-cgi進程的確沒辦法平滑重啟的。php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,通過這種機制來平滑過度。

php-fpm提供了更好的php進程管理方式,可以有效的控制內存和進程,可以平滑重載php配置。

總結一下這個升級的過程:?

923b0d8a31676cf6d8a6622c0586dbb4.png

如果要搭建一個高性能的PHP WEB服務器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了。?

參考:

? ? ??https://segmentfault.com/a/1190000010968145

??????https://www.awaimai.com/371.html

287882a6e583c80f7765002ad2830c2e.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533767.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android群英傳神兵利器pdf,《Android群英傳:神兵利器》勘誤

1勘誤一晃,我的新書《Android群英傳:神兵利器》上市好多天了,有不少朋友已經拿到書了。本來以為,這次我看了不下十遍,再加上編輯們的校對,應該不會有很多勘誤了吧~ 可事實證明,我還是太年輕啊!大…

datatype未定義是什么意思_TypeError:無法讀取未定義的屬性'then'

loginService.islogged()上面的函數返回一個像“失敗”的字符串 . 但是,當我嘗試運行然后對它運行時,它將返回錯誤TypeError: Cannot read property then of undefined并且光標在 connected 之后和 .then 之前指示 .以下是完整功能:var conne…

python運行命令_對python中執行DOS命令的3種方法總結

1. 使用os.system("cmd") 特點是執行的時候程序會打出cmd在Linux上執行的信息。 import os os.system("ls") 2. 使用Popen模塊產生新的process 現在大部分人都喜歡使用Popen。Popen方法不會打印出cmd在linux上執行的信息。的確,Popen非常強大&a…

android studio 不生成buildconfig,Android Studio Update 0.4.0找不到buildConfig()

將Android Studio升級到版本0.4.0后,出現了一個新錯誤:我通過gradle-wrapper.properties升級到gradle 1.9distributionUrlhttp\://services.gradle.org/distributions/gradle-1.9-all.zip并升級了build.gradle中的gradle版本dependencies {classpath com…

譚民機器人_機器人視覺伺服研究進展-中科院自動化所-譚民.

文章編號:100220446(2004 0320277206機器人視覺伺服研究進展Ξ王麟琨,徐德,譚民(中國科學院自動化研究所復雜系統與智能科學實驗室,北京100080摘要:,針對當前機器人視覺伺服所面臨的主要問題, .關鍵詞:機器人;視覺伺服;綜述中圖分類號::Survey of R esearch on Robotic Visual …

mysql 按月和年累加_廣西柳州市市場監管局公布市2020年11月(第一批)電梯按需維保試點名單...

中國質量新聞網訊 根據《柳州市改進電梯維護保養模式試點工作方案》,近日,廣西柳州市市場監管局公布柳州市首批按需維保試點電梯名單,冠亞藍灣國際小區和南慶安置小區共46臺電梯成為首批試點電梯,標志著柳州市全面啟動了按需維保改…

python默認深拷貝_Python 深拷貝與淺拷貝

首先分享Python里面的數據類型1、不可變類型:Number(數字)、String(字符串)、Tuple(元組)。不可變數據類型在第一次聲明賦值的時候, 會在內存中開辟一塊空間, 用來存放這個變量被賦的值, 而這個變量實際上存儲的, 并不是被賦予的這個值, 而是存放這個值所在空間的內…

上傳 mp4 格式判斷_視頻如何轉換成通用的MP4格式?按下這個鍵,10秒就能搞定...

我們在網上下載視頻的時候,有很多的視頻都是無法播放的,或者是需要特定的播放器才可以播放。其實,只要把這些視頻的格式轉換成通用的MP4格式即可。如果你還不知道怎么轉換視頻格式,下面就教大家兩個小方法,百試百靈。一…

android不能在主線程,安卓開發:主線程真的不能做UI操作嗎?這一點很多程序員都沒想到...

只要參與過安卓項目開發一兩年的朋友們應該清楚,為了避免UI渲染出現異常安卓框架限制UI操作只能在主線程中進行,如果貿然在子線程做了UI操作結果會怎樣?我們隨便寫下了如下測試代碼。不出意外的話,代碼執行報錯拋出了名為CalledFr…

c++注釋快捷鍵_Jupyter Notebook amp; Lab快捷鍵大全

Jupyter有兩種模式,命令模式和編輯模式,分別有不同的快捷鍵。編輯模式(按鍵 Enter 切換):可以往單元中鍵入代碼或文本,此時單元格被藍色的框線包圍,且命令模式下的快捷鍵不生效; 命令模式 (按鍵 Esc 開啟)&…

多核cpu應用場景_CPU占用100%!PC卡頓原來可以這么解決:多場景多任務也流暢

現代生活里,不論是工作還是生活,多開軟件和處理事務可以說都是家常便飯的事情。一邊玩著醉心已久的游戲,一邊解壓著新的電影和游戲;為了查詢資料,一不小心打開了數十個網頁;復雜繁重的工作鑄就了動輒上百兆…

swot分析法案例_項目型銷售案例剖析的五大步驟

我們的案例分析方式是根據哈佛大學與中歐國際工商學院的案例分析方法來總結出我們的模式的。這種分析方法包括兩種互相關聯和依賴的方面。第一方面,就是要對所指定的將供集體討論的案例,做出深刻而有意義的分析,包括找出案例所描述的情景中存…

autojs 云控_autojs websocket 核心示例代碼,云控技術

//初始化方法function recordInit(scriptName){//let ipInfoJson getIP()// let ip ipInfoJson.cip// let location ipInfoJson.cnamelet deviceIMEI ,deviceBrand,deviceModel,AndroidVer,deviceWH,deviceBoard,deviceMac,AndroidIdtry {deviceBrand device.brand;//制造…

定時器和promise_從Promise鏈理解EventLoop

面試題new Promise(resolve > { setTimeout(()>{ console.log(666); new Promise(resolve > { resolve(); }) .then(() > {console.log(777);}) }) resolve(); }) .then(() > { new Promise(resolve > { resolve(); …

ugui源碼_UGUI整體解決方案基礎篇(Unity 2019)

課程介紹:本課程是UGUI系列課程的第一篇:基礎篇主要是講解UGUI的基礎組件及接口的使用方法,目前UGUI是unity最常用的UI系統,這部分基礎只是是每個同學都應該掌握的,這里我就是簡單的講解了用法,大家對UGUI熟…

android 實例源碼解釋,Android Handler 原理分析及實例代碼

Android Handler 原理分析Handler一個讓無數android開發者頭疼的東西,希望我今天這邊文章能為您徹底根治這個問題今天就為大家詳細剖析下Handler的原理Handler使用的原因1.多線程更新Ui會導致UI界面錯亂2.如果加鎖會導致性能下降3.只在主線程去更新UI,輪詢處理Handl…

amd cpu排行_最新intel和amd處理器性能排行cpu天梯圖2019

現在市面上cpu廠家有很多,比如常見的intel系列的、amd系列CPU,cpu對電腦起著至關重要的作用,所以我們需要知道cpu性能的好壞,為此小編這就給大家帶來最新intel和amd處理器性能排行對比天梯圖,大家可以了解一下吧。inte…

python中的對象列表_Python內建的對象列表

Python內建的對象列表剛寫Python肯定會遇到這樣的情況,想寫些什么,但又不知從何寫起...在我看來問題在于我們不知道有什么東東可以拿來玩,這里列出Python的內建對象,稍微歸類了一下,多看幾遍代碼自然筆上生花&#xff…

電腦會顯示android,怎么在電腦上顯示、操作安卓手機

想要在電腦上顯示、操作安卓手機,該怎么辦,那么怎么在電腦上顯示、操作安卓手機的呢?下面是學習啦小編收集整理的怎么在電腦上顯示、操作安卓手機,希望對大家有幫助~~在電腦上顯示、操作安卓手機的方法工具/原料windows操作系統安卓手機電腦…

git version是什么軟件_Deepin 15.11 安裝 ZoneMinder 視頻監控軟件

Zoneminder是一款開源的視頻監控軟件,可以很方便的連接ip攝像頭。因計劃將家中的監控攝像頭引入NAS,在一臺deepin系統的筆記本是先進行了測試。UBUNTU和debian系統都是很容易安裝這個軟件的。未來在NAS上用docker啟動一個專門的zoneminder,do…