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