CGI、FastCGI 知识总结
一、CGI
1、基礎(chǔ)介紹
公共網(wǎng)關(guān)接口CGI(Common GatewayInterface) 是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位。CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器。
Common Gateway Interface,簡(jiǎn)稱CGI。在物理上是一段程序,運(yùn)行在服務(wù)器上,提供同客戶端HTML頁(yè)面的接口。這樣說(shuō)大概還不好理解。那么我們看一個(gè)實(shí)際例子:現(xiàn)在的個(gè)人主頁(yè)上大部分都有一個(gè)留言本。留言本的工作是這樣的:先由用戶在客戶端輸入一些信息,如名字之類的東西。接著用戶按一下“留言”(到目前為止工作都在客戶端),瀏覽器把這些信息傳送到服務(wù)器的CGI目錄下特定的cgi程序中,于是cgi程序在服務(wù)器上按照預(yù)定的方法進(jìn)行處理。在本例中就是把用戶提交的信息存入指定的文件中。然后cgi程序給客戶端發(fā)送一個(gè)信息,表示請(qǐng)求的任務(wù)已經(jīng)結(jié)束。此時(shí)用戶在瀏覽器里將看到“留言結(jié)束”的字樣。整個(gè)過(guò)程結(jié)束。
絕大多數(shù)的CGI程序被用來(lái)解釋處理來(lái)自表單的輸入信息,并在服務(wù)器產(chǎn)生相應(yīng)的處理,或?qū)⑾鄳?yīng)的信息反饋給瀏覽器。CGI程序使網(wǎng)頁(yè)具有交互功能。
CGI是一種基于瀏覽器的輸入、在Web服務(wù)器上運(yùn)行的程序方法。CGI腳本使你的瀏覽器與用戶能交互,為了在數(shù)據(jù)庫(kù)中尋找一個(gè)名詞,提供你寫(xiě)入的評(píng)論,或者從一個(gè)表單中選擇幾個(gè)條目并且能得到一個(gè)明確的回答。如果你曾經(jīng)遇到過(guò)在web上填表或進(jìn)行搜索,你就是用的CGI腳本,你那時(shí)也許沒(méi)有意識(shí)到,因?yàn)榇蟛糠止ぷ魇窃诜?wù)器上運(yùn)行的,你看到的只是結(jié)果。
2、CGI 優(yōu)點(diǎn)
CGI可以為我們提供許多HTML無(wú)法做到的功能。比如:
? a. 一個(gè)記數(shù)器
? b. 顧客信息表格的提交以及統(tǒng)計(jì)
? c. 搜索程序
? d. WEB數(shù)據(jù)庫(kù)
用Html是沒(méi)有辦法記住客戶的任何信息的,就算用戶愿意讓你知道。用Html也是無(wú)法把信息記錄到某一個(gè)特定文件里的。要把客戶端的信息記錄在服務(wù)器的硬盤(pán)上,就要用到CGI。這是CGI最重要的作用,它補(bǔ)充了Html的不足。是的,僅僅是補(bǔ)充,不是替代。
使在網(wǎng)絡(luò)服務(wù)器下運(yùn)行外部分應(yīng)用程序(或網(wǎng)關(guān))成為可能。CGI-BIN 目錄是存放CGI腳本的地方。這些腳本使WWW服務(wù)器和瀏覽器能運(yùn)行外部程序,而無(wú)需啟動(dòng)另一個(gè)原因程序。
CGI是運(yùn)行在Web服務(wù)器上的一個(gè)程序,并由來(lái)自于瀏覽者的輸入觸發(fā)。CGI是在HTTP服務(wù)器下運(yùn)行外部程序(或網(wǎng)關(guān))的一個(gè)接口,它能讓網(wǎng)絡(luò)用戶訪問(wèn)遠(yuǎn)程系統(tǒng)上的使用類型程序,就好像他們?cè)趯?shí)際使用那些遠(yuǎn)程計(jì)算機(jī)一樣。
CGI能夠讓瀏覽者與服務(wù)器進(jìn)行交互,如果你曾經(jīng)遇到過(guò)在網(wǎng)絡(luò)上填表或者進(jìn)行搜索,就很有可能就是用的CGI。
盡管CGI易于使用,但是當(dāng)大批人同時(shí)使用一個(gè)CGI應(yīng)用程序是會(huì)反應(yīng)較慢,網(wǎng)絡(luò)服務(wù)器速度也會(huì)受到很大影響。CGI應(yīng)用程序的優(yōu)點(diǎn)是可以獨(dú)立運(yùn)行。
CGI應(yīng)用程序可以由大多數(shù)的編程語(yǔ)言編寫(xiě),如Perl(Practical Extraction and Report Language)、C\C++、Java 和 Visual Basic 等。不過(guò)對(duì)于那些沒(méi)有太多編程經(jīng)驗(yàn)的網(wǎng)頁(yè)制作人來(lái)說(shuō),實(shí)在是一個(gè)不小的難題。
3、CGI應(yīng)用程序的工作原理
? a. 瀏覽器通過(guò)HTML表單或超鏈接請(qǐng)求指上一個(gè)CGI應(yīng)用程序的URL。
? b. 服務(wù)器收發(fā)到請(qǐng)求。
? c. 服務(wù)器執(zhí)行指定所CGI應(yīng)用程序。
? d. CGI應(yīng)用程序執(zhí)行所需要的操作,通常是基于瀏覽者輸人的內(nèi)容。
? e. CGI應(yīng)用程序把結(jié)果格式化為網(wǎng)絡(luò)服務(wù)器和瀏覽器能夠理解的文檔(通常是HTML網(wǎng)頁(yè))。
? f. 網(wǎng)絡(luò)服務(wù)器把結(jié)果返回到瀏覽器中。
4、一個(gè)簡(jiǎn)單的例子
Display Date處是個(gè)指向CGI腳本的連接,它的HTML是這樣的:
<a href="http://www.popchina.com/cgi-bin/getdate">Display the Date</a>說(shuō)明是個(gè)CGI腳本是因?yàn)檫@里面有個(gè)cgi-bin的路徑,在許多服務(wù)器cgi-bin是僅能夠放置CGI腳本的目錄。
當(dāng)你選擇這個(gè)連接時(shí),你的瀏覽器將向 www.popchina.com 服務(wù)器提出請(qǐng)求,服務(wù)器接收這個(gè)請(qǐng)求計(jì)算出URL處的腳本文件名然后執(zhí)行這個(gè)腳本。
這個(gè)getdate腳本,在UNIX系統(tǒng)中執(zhí)行是這樣的:
#!/bin/sh echo Content-type: text/plain echo /bin/date第一行是個(gè)特殊的命令,告訴UNIX系統(tǒng)這是個(gè)shell腳本;真實(shí)的情況是從這行開(kāi)始的下一行。這個(gè)腳本做兩件事:它輸出行Content-type: text/plain,接著開(kāi)始一個(gè)空行;第二,它調(diào)用UNIX系統(tǒng)時(shí)間date程序,這樣輸出日期和時(shí)間。
腳本執(zhí)行后輸出應(yīng)該這樣:
Content-type: text/plain Tue Oct 25 16:15:57 EDT 1994這個(gè)Content-type是什么東東?它是個(gè)特殊的編碼,Web服務(wù)器用來(lái)告訴瀏覽器輸出這個(gè)文本是什么類型的,這與HTML中Content-type含義是一樣的。
5、環(huán)境變量列表
SERVER_NAME ? ? ? ? ? ? ?運(yùn)行CGI序?yàn)闄C(jī)器名或IP地址。
SERVER_INTERFACE ? ? ?WWW服務(wù)器的類型,如:CERN型或NCSA型。
SERVER_PROTOCOL ? ? ?通信協(xié)議,應(yīng)當(dāng)是HTTP/1.0。
SERVER_PORT ? ? ? ? ? ? ?TCP端口,一般說(shuō)來(lái)web端口是80。
HTTP_ACCEPT ? ? ? ? ? ? ? HTTP定義的瀏覽器能夠接受的數(shù)據(jù)類型。
HTTP_REFERER ? ? ? ? ? ? 發(fā)送表單的文件URL。(并非所有的瀏覽器都傳送這一變量)
HTTP_USER-AGENT ? ? ? 發(fā)送表單的瀏覽器的有關(guān)信息。
GETWAY_INTERFACE ? ? CGI程序的版本,在UNIX下為 CGI/1.1。
PATH_TRANSLATED ? ? ? PATH_INFO中包含的實(shí)際路徑名。
PATH_INFO ? ? ? ? ? ? ? ? ? 瀏覽器用GET方式發(fā)送數(shù)據(jù)時(shí)的附加路徑。
SCRIPT_NAME ? ? ? ? ? ? ? CGI程序的路徑名。
QUERY_STRING ? ? ? ? ? ?表單輸入的數(shù)據(jù),URL中問(wèn)號(hào)后的內(nèi)容。
REMOTE_HOST ? ? ? ? ? ? 發(fā)送程序的主機(jī)名,不能確定該值。
REMOTE_ADDR ? ? ? ? ? ? 發(fā)送程序的機(jī)器的IP地址。
REMOTE_USER ? ? ? ? ? ? 發(fā)送程序的人名。
CONTENT_TYPE ? ? ? ? ? ?POST發(fā)送,一般為application/xwww-form-urlencoded。
CONTENT_LENGTH ? ? ? ?POST方法輸入的數(shù)據(jù)的字節(jié)數(shù)。
?
二、FastCGI
1、什么是FastCGI
FastCGI像是一個(gè)常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會(huì)每次都要花費(fèi)時(shí)間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分布式的運(yùn)算,即 FastCGI程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行并且接受來(lái)自其它網(wǎng)站服務(wù)器來(lái)的請(qǐng)求。
FastCGI是語(yǔ)言無(wú)關(guān)的、可伸縮架構(gòu)的CGI開(kāi)放擴(kuò)展,其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得較高的性能。眾所周知,CGI解釋器的反復(fù)加載是CGI性能低下的主要原因,如果CGI解釋器保持在內(nèi)存中并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能、伸縮性、Fail-Over特性等等。
2、FastCGI的工作原理
a. Web Server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(IIS ISAPI或Apache Module)
b. FastCGI進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程(可見(jiàn)多個(gè)php-cgi)并等待來(lái)自Web Server的連接。
c. 當(dāng)客戶端請(qǐng)求到達(dá)Web Server時(shí),FastCGI進(jìn)程管理器選擇并連接到一個(gè)CGI解釋器。Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi。
d. FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí),請(qǐng)求便告處理完成。FastCGI子進(jìn)程接著等待并處理來(lái)自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個(gè)連接。 在CGI模式中,php-cgi在此便退出了。
在上述情況中,你可以想象CGI通常有多慢。每一個(gè)Web請(qǐng)求PHP都必須重新解析php.ini、重新載入全部擴(kuò)展并重初始化全部數(shù)據(jù)結(jié)構(gòu)。使用FastCGI,所有這些都只在進(jìn)程啟動(dòng)時(shí)發(fā)生一次。一個(gè)額外的好處是,持續(xù)數(shù)據(jù)庫(kù)連接(Persistent database connection)可以工作。
3、FastCGI的不足
因?yàn)槭?span style="color:#ff0000;">多進(jìn)程,所以比CGI多線程消耗更多的服務(wù)器內(nèi)存,PHP-CGI解釋器每進(jìn)程消耗7至25兆內(nèi)存,將這個(gè)數(shù)字乘以50或100就是很大的內(nèi)存數(shù)。
Nginx 0.8.46+PHP 5.2.14(FastCGI)服務(wù)器在3萬(wàn)并發(fā)連接下,開(kāi)啟的10個(gè)Nginx進(jìn)程消耗150M內(nèi)存(15M*10=150M),開(kāi)啟的64個(gè)php-cgi進(jìn)程消耗1280M內(nèi)存(20M*64=1280M),加上系統(tǒng)自身消耗的內(nèi)存,總共消耗不到2GB內(nèi)存。如果服務(wù)器內(nèi)存較小,完全可以只開(kāi)啟25個(gè)php-cgi進(jìn)程,這樣php-cgi消耗的總內(nèi)存數(shù)才500M。
上面的數(shù)據(jù)摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建勝過(guò)Apache十倍的Web服務(wù)器(第6版)
?
三、FastCGI與CGI特點(diǎn)
1、如CGI、FastCGI也具有語(yǔ)言無(wú)關(guān)性。
2、如CGI、FastCGI在進(jìn)程中的應(yīng)用程序,獨(dú)立于核心web服務(wù)器運(yùn)行,提供了一個(gè)比API更安全的環(huán)境。(APIs把應(yīng)用程序的代碼與核心的web服務(wù)器鏈接在一起,這意味著在一個(gè)錯(cuò)誤的API的應(yīng)用程序可能會(huì)損壞其他應(yīng)用程序或核心服務(wù)器;惡意的API的應(yīng)用程序代碼甚至可以竊取另一個(gè)應(yīng)用程序或核心服務(wù)器的密鑰。)
3、FastCGI技術(shù)目前支持語(yǔ)言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相關(guān)模塊在Apache、ISS、Lighttpd等流行的服務(wù)器上也是可用的。
4、如CGI、FastCGI的不依賴于任何Web服務(wù)器的內(nèi)部架構(gòu),因此即使服務(wù)器技術(shù)的變化,FastCGI依然穩(wěn)定不變。
?
四、PHP-CGI
PHP-CGI是PHP自帶的FastCGI管理器。
PHP-CGI的不足:
? a. php-cgi變更php.ini配置后需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟。
? b. 直接殺死php-cgi進(jìn)程,php就不能運(yùn)行了。(PHP-FPM和Spawn-FCGI就沒(méi)有這個(gè)問(wèn)題,守護(hù)進(jìn)程會(huì)平滑從新生成新的子進(jìn)程)
PHP-FPM、Spawn-FCGI相關(guān)信息可以詳看:http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/
?
轉(zhuǎn)載:http://baike.baidu.com/subview/32614/12037322.htm?fr=aladdin
? ? ? ??http://www.jdon.com/idea/cgi.htm
?
總結(jié)
以上是生活随笔為你收集整理的CGI、FastCGI 知识总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 20年工作经验的架构师写给程序员的一封信
- 下一篇: apache的prefork和workd