1、CGI php
一、基礎介紹css
公共網關接口CGI(Common GatewayInterface) 是WWW技術中最重要的技術之一,有着不可替代的重要地位。CGI是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。CGI規範容許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器。nginx
Common Gateway Interface,簡稱CGI。在物理上是一段程序,運行在服務器上,提供同客戶端HTML頁面的接口。這樣說大概還很差理解。那麼咱們看一個實際例子:如今的我的主頁上大部分都有一個留言本。留言本的工做是這樣的:先由用戶在客戶端輸入一些信息,如名字之類的東西。接着用戶按一下「留言」(到目前爲止工做都在客戶端),瀏覽器把這些信息傳送到服務器的CGI目錄下特定的cgi程序中,因而cgi程序在服務器上按照預約的方法進行處理。在本例中就是把用戶提交的信息存入指定的文件中。而後cgi程序給客戶端發送一個信息,表示請求的任務已經結束。此時用戶在瀏覽器裏將看到「留言結束」的字樣。整個過程結束。web
絕大多數的CGI程序被用來解釋處理來自表單的輸入信息,並在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI程序使網頁具備交互功能。shell
CGI是一種基於瀏覽器的輸入、在Web服務器上運行的程序方法。CGI腳本使你的瀏覽器與用戶能交互,爲了在數據庫中尋找一個名詞,提供你寫入的評論,或者從一個表單中選擇幾個條目而且能獲得一個明確的回答。若是你曾經遇到過在web上填表或進行搜索,你就是用的CGI腳本,你那時也許沒有意識到,由於大部分工做是在服務器上運行的,你看到的只是結果。數據庫
二、CGI 優勢編程
CGI能夠爲咱們提供許多HTML沒法作到的功能。好比:
a. 一個記數器
b. 顧客信息表格的提交以及統計
c. 搜索程序
d. WEB數據庫瀏覽器
用Html是沒有辦法記住客戶的任何信息的,就算用戶願意讓你知道。用Html也是沒法把信息記錄到某一個特定文件裏的。要把客戶端的信息記錄在服務器的硬盤上,就要用到CGI。這是CGI最重要的做用,它補充了Html的不足。是的,僅僅是補充,不是替代。安全
使在網絡服務器下運行外部分應用程序(或網關)成爲可能。CGI-BIN 目錄是存放CGI腳本的地方。這些腳本使WWW服務器和瀏覽器能運行外部程序,而無需啓動另外一個緣由程序。服務器
CGI是運行在Web服務器上的一個程序,並由來自於瀏覽者的輸入觸發。CGI是在HTTP服務器下運行外部程序(或網關)的一個接口,它能讓網絡用戶訪問遠程系統上的使用類型程序,就好像他們在實際使用那些遠程計算機同樣。
CGI可以讓瀏覽者與服務器進行交互,若是你曾經遇到過在網絡上填表或者進行搜索,就頗有可能就是用的CGI。
儘管CGI易於使用,可是當大批人同時使用一個CGI應用程序是會反應較慢,網絡服務器速度也會受到很大影響。CGI應用程序的優勢是能夠獨立運行。
CGI應用程序能夠由大多數的編程語言編寫,如Perl(Practical Extraction and Report Language)、C\C++、Java 和 Visual Basic 等。不過對於那些沒有太多編程經驗的網頁製做人來講,實在是一個不小的難題。
三、CGI應用程序的工做原理
a. 瀏覽器經過HTML表單或超連接請求指上一個CGI應用程序的URL。
b. 服務器收發到請求。
c. 服務器執行指定所CGI應用程序。
d. CGI應用程序執行所須要的操做,一般是基於瀏覽者輸人的內容。
e. CGI應用程序把結果格式化爲網絡服務器和瀏覽器可以理解的文檔(一般是HTML網頁)。
f. 網絡服務器把結果返回到瀏覽器中。
四、一個簡單的例子
Display Date處是個指向CGI腳本的鏈接,它的HTML是這樣的:
<a href="http://www.popchina.com/cgi-bin/getdate">Display the Date</a>
說明是個CGI腳本是由於這裏面有個cgi-bin的路徑,在許多服務器cgi-bin是僅可以放置CGI腳本的目錄。
當你選擇這個鏈接時,你的瀏覽器將向 www.popchina.com 服務器提出請求,服務器接收這個請求計算出URL處的腳本文件名而後執行這個腳本。
這個getdate腳本,在UNIX系統中執行是這樣的:
#!/bin/sh echo Content-type: text/plain echo /bin/date
第一行是個特殊的命令,告訴UNIX系統這是個shell腳本;真實的狀況是從這行開始的下一行。這個腳本作兩件事:它輸出行Content-type: text/plain,接着開始一個空行;第二,它調用UNIX系統時間date程序,這樣輸出日期和時間。
腳本執行後輸出應該這樣:
Content-type: text/plain Tue Oct 25 16:15:57 EDT 1994
這個Content-type是什麼東東?它是個特殊的編碼,Web服務器用來告訴瀏覽器輸出這個文本是什麼類型的,這與HTML中Content-type含義是同樣的。
五、環境變量列表
SERVER_NAME 運行CGI序爲機器名或IP地址。
SERVER_INTERFACE WWW服務器的類型,如:CERN型或NCSA型。
SERVER_PROTOCOL 通訊協議,應當是HTTP/1.0。
SERVER_PORT TCP端口,通常說來web端口是80。
HTTP_ACCEPT HTTP定義的瀏覽器可以接受的數據類型。
HTTP_REFERER 發送表單的文件URL。(並不是全部的瀏覽器都傳送這一變量)
HTTP_USER-AGENT 發送表單的瀏覽器的有關信息。
GETWAY_INTERFACE CGI程序的版本,在UNIX下爲 CGI/1.1。
PATH_TRANSLATED PATH_INFO中包含的實際路徑名。
PATH_INFO 瀏覽器用GET方式發送數據時的附加路徑。
SCRIPT_NAME CGI程序的路徑名。
QUERY_STRING 表單輸入的數據,URL中問號後的內容。
REMOTE_HOST 發送程序的主機名,不能肯定該值。
REMOTE_ADDR 發送程序的機器的IP地址。
REMOTE_USER 發送程序的人名。
CONTENT_TYPE POST發送,通常爲application/xwww-form-urlencoded。
CONTENT_LENGTH POST方法輸入的數據的字節數。
2、FastCGI
一、什麼是FastCGI
FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。它還支持分佈式的運算,即 FastCGI程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail-Over特性等等。
二、FastCGI的工做原理
a. Web Server啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)
b. FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的鏈接。
c. 當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
d. FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。 在CGI模式中,php-cgi在此便退出了。
在上述狀況中,你能夠想象CGI一般有多慢。每個Web請求PHP都必須從新解析php.ini、從新載入所有擴展並重初始化所有數據結構。使用FastCGI,全部這些都只在進程啓動時發生一次。一個額外的好處是,持續數據庫鏈接(Persistent database connection)能夠工做。
三、FastCGI的不足
由於是多進程,因此比CGI多線程消耗更多的服務器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。
Nginx 0.8.46+PHP 5.2.14(FastCGI)服務器在3萬併發鏈接下,開啓的10個Nginx進程消耗150M內存(15M*10=150M),開啓的64個php-cgi進程消耗1280M內存(20M*64=1280M),加上系統自身消耗的內存,總共消耗不到2GB內存。若是服務器內存較小,徹底能夠只開啓25個php-cgi進程,這樣php-cgi消耗的總內存數才500M。
上面的數據摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建賽過Apache十倍的Web服務器(第6版)
3、FastCGI與CGI特色
一、如CGI、FastCGI也具備語言無關性。
二、如CGI、FastCGI在進程中的應用程序,獨立於核心web服務器運行,提供了一個比API更安全的環境。(APIs把應用程序的代碼與核心的web服務器連接在一塊兒,這意味着在一個錯誤的API的應用程序可能會損壞其餘應用程序或核心服務器;惡意的API的應用程序代碼甚至能夠竊取另外一個應用程序或核心服務器的密鑰。)
三、FastCGI技術目前支持語言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相關模塊在Apache、ISS、Lighttpd等流行的服務器上也是可用的。
四、如CGI、FastCGI的不依賴於任何Web服務器的內部架構,所以即便服務器技術的變化,FastCGI依然穩定不變。
4、PHP-CGI
PHP-CGI是PHP自帶的FastCGI管理器。
PHP-CGI的不足:
a. php-cgi變動php.ini配置後需重啓php-cgi才能讓新的php-ini生效,不能夠平滑重啓。
b. 直接殺死php-cgi進程,php就不能運行了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護進程會平滑重新生成新的子進程)
PHP-FPM、Spawn-FCGI相關信息能夠詳看:http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/
轉載:http://baike.baidu.com/subview/32614/12037322.htm?fr=aladdin http://www.jdon.com/idea/cgi.htm