FreeBSD連載(82):數據處理方式

2000年1月23日 01:55 王波

數據處理方式

  當瀏覽器通過各種請求方法,試圖從伺服器獲得數據的時候,伺服器就必須將正確的數據返回給瀏覽器。瀏覽器並不 關心伺服器是如何進行處理的,伺服器可以返回一個預先編輯好的HTML文檔,也能根據請求動態生成返回的數據。而WW W的一大特點就是能用來傳送多媒體數據,並且這些數據的傳送是完全透明的,通過同樣的HTTP連接,可以傳送不同格式 的聲音、圖象等數據。當伺服器僅僅用於返回靜態的HTML文檔的時候,瀏覽器能夠很容易的識別其數據類型,但當伺服器 不但用於返回靜態的HTML文檔,還可以動態返回各種類型的多媒體信息時,瀏覽器就不能僅僅從URL請求本身上判斷服 務器將會返回何種數據了。

  伺服器和瀏覽器之間是採用了另外的方式來標識數據的類型,這種方式下通過在傳輸真正的數據之前,預先傳輸一個 數據的MIME類型的方法,來標識數據類型。

  • 多媒體檔案格式MIME

  最早的HTTP協議中,並沒有附加的數據類型信息,所有傳送的數據都被客戶程序解釋為超文本標記語言HTML 文檔,而為了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。

  MIME意為多目Internet郵件擴展,它設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件 客戶程序能根據其類型進行處理。然而當它被HTTP協議支持之後,它的意義就更為顯著了。它使得HTTP傳輸的不僅是 普通的文本,而變得豐富多彩。

  每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,後面定義具體的 種類。

常見的MIME類型

超文本標記語言文本.html,.htmltext/html
普通文本.txttext/plain
RTF文本.rtfapplication/rtf
GIF圖形.gifimage/gif
JPEG圖形.ipeg,.jpgimage/jpeg
au聲音檔案.auaudio/basic
MIDI音樂檔案mid,.midiaudio/midi,audio/x-midi
RealAudio音樂檔案.ra, .ramaudio/x-pn-realaudio
MPEG檔案.mpg,.mpegvideo/mpeg
AVI檔案 .avivideo/x-msvideo
GZIP檔案.gzapplication/x-gzip
TAR檔案.tarapplication/x-tar

  Internet中有一個專門組織IANA來確認標準的MIME類型,但Internet發展的太快,很多應 用程序等不及IANA來確認他們使用的MIME類型為標準類型。因此他們使用在類別中以x-開頭的方法標識這個類別還 沒有成為標準,例如:x-gzip,x-tar等。事實上這些類型運用的很廣泛,已經成為了事實標準。只要客戶機和服 務器共同承認這個MIME類型,即使它是不標準的類型也沒有關系,客戶程序就能根據MIME類型,採用具體的處理手段 來處理數據。而Web伺服器和瀏覽器(包括操作系統)中,預設都設置了標準的和常見的MIME類型,只有對於不常見的 MIME類型,才需要同時設置伺服器和客戶瀏覽器,以進行識別。

  由於MIME類型與文檔的後綴相關,因此伺服器使用文檔的後綴來區分不同檔案的MIME類型,伺服器中必須定 義文檔後綴和MIME類型之間的對應關系。而客戶程序從伺服器上接收數據的時候,它只是從伺服器接受數據流,並不了解 文檔的名字,因此伺服器必須使用附加信息來告訴客戶程序數據的MIME類型。伺服器在發送真正的數據之前,就要先發送 標志數據的MIME類型的信息,這個信息使用Content-type關鍵字進行定義,例如對於HTML文檔,伺服器 將首先發送以下兩行MIME標識信息,這個標識並不是真正的數據檔案的一部分。

  Content-type: text/html

  注意,第二行為一個空行,這是必須的,使用這個空行的目的是將MIME信息與真正的數據內容分隔開。

  • CGI與SSI

  普通伺服器返回的文檔為靜態的HTML文檔,文檔中的內容為靜態的。而很多情況下,需要根據瀏覽器發送請求時 的條件改變瀏覽器返回的文檔的內容。有些情況下,伺服器能提供更複雜的功能,如通過瀏覽器登記用戶的信息等,這些情況 就要求Web伺服器能根據請求運行一些特定的應用程序,來完成更複雜的服務功能。

  返回動態文檔的基本方法是使用通用網關接口CGI,它定義了Web伺服器和由它執行的程序共享信息的方法。這 樣Web伺服器可以根據瀏覽器的請求,在伺服器端運行CGI程序,這個程序可以根據HTTP伺服器設置的各種環境變量 、伺服器磁碟檔案中保存的相關信息、以及伺服器輸入的客戶端的請求信息,創建動態網頁,並通過伺服器返回給瀏覽器。CGI 標準十分簡單,一個CGI程序就是一個標準Unix程序,它從命令行參數和標準輸入中獲得用戶在瀏覽器上輸入的信 息,使用環境變量獲得目前瀏覽客戶的設置情況,最後使用標準輸出輸出它創建的動態網頁。因此可以使用各種編程語言編寫 CGI程序,如sh、C或Perl。

  可以使用C這樣的編譯型語言來編寫CGI程序,也可以使用解釋型的語言來編寫CGI程序,這兩種方法各有優劣 。使用C編程效率較高,但由於要處理的內容大部分為文本,因此需要大量的編寫、調試工作,效率不高。而解釋型語言編寫 、調試程序比較容易,並且由於大部分解釋語言都有強大的內建文本處理功能,本身就比較適合處理文檔,因此解釋語言在CGI 編寫方面有一定的優勢。例如Perl語言本身功能就十分強大,是用於CGI編程一種主要編程語言工具。但是解釋型 的語言本身存在效率問題,伺服器執行解釋型的CGI程序時首先要將解釋語言器載入內存,這增加了伺服器的額外開銷。

  CGI需要啟動一個額外的CGI程序以創建動態文檔,由於每處理一個CGI請求都要啟動一個進程,這樣就加重 了伺服器端的負擔。另一種產生動態文檔的方式是使用伺服器端分析文檔,HTTP伺服器不啟動外部CGI程序來產生動態 文檔,而是由伺服器本身分析要返回的html文檔,對其中的一些特殊標記進行解釋,並根據情況生成為符合HTML語法 的具體數據,從而產生動態HTML文檔。顯然伺服器端分析文檔需要特殊功能的伺服器,因此與CGI不同,並不存在服務 器分析文檔的標準。常見的伺服器端分析方式有SSI、PHP、ASP等,然而由於這並不是標準,Web伺服器可以有選 擇的支持這些特殊功能。

  最基本的伺服器分析文檔標準為SSI(Server Side Include),它能快速的處理一些簡單的 標志,使得創建動態HTML文檔更為容易。SSI主要是採用宏替換的方式處理網頁,當一個使用SSI處理過的HTML 檔案被返回給瀏覽器時,有些與文檔本身相關的信息,如文檔最後一次修改時間等原本在HTML文檔中使用特殊的標記來表 示的信息,都會被替換為正確的數據。