用於web伺服器的方法和系統的製作方法
2023-05-10 16:46:31 3
專利名稱:用於web伺服器的方法和系統的製作方法
技術領域:
本發明涉及web伺服器技術,具體的說本發明提供一種新型的web伺服器系統以 及伺服器端的動態網頁生成方法。
背景技術:
web伺服器是基於網際網路的信息獲得的主要裝置,它接受用戶的信息請求,並將用 戶請求的結果以web頁面發給用戶,從而形成信息交換。目前,web伺服器一般使用http 協議,web頁面一般使用基於html或xml標記的代碼,它由位於客戶端的瀏覽器(如ie, firefox,opera等)負責解釋和顯示。目前Web伺服器系統主要有Apache、IIS等。在web伺服器發展的初期,主要以靜態的html頁面為主,對於有交互性要求的請 求,則採用CGI方式進行。睡著網際網路的高速發展,web應用的需求日益增加,CGI方式的弊端日益突出,主 要在於,CGI方式限制比較多,尤其是用CGI生成web頁面,效率非常低,工作量巨大。於是,動態網頁技術隨之產生,所謂動態網頁,是指在基於html或xml標記的web 頁面中嵌入運行於伺服器端的程式語言代碼(通過特定的標記),由伺服器將所述web頁面 內容以及web頁面中包含的程式語言執行結果所形成的內容一起發往客戶端,由於所述編 程語言是嵌在原來的靜態頁面中,所以,整個web頁面的安排,包括以後的修改,基本上不 需要程式語言來負責,因而,效率比CGI方式提高很多。如php,asp, jsp等技術。ASP (Active Server Page),是一種包含了使用 VB Script 或 Jscript 腳本程序代 碼的網頁。當瀏覽器瀏覽ASP網頁時,Web伺服器就會根據請求生成相應的HTML代碼然後 再返回給瀏覽器,這樣瀏覽器端看到的就是動態生成的網頁。PHP也是一種用來製作動態網頁的伺服器端腳本語言。通過PHP和HTML創建頁 面。當訪問者打開網頁時,伺服器端便會處理PHP指令,然後把其處理結果送到訪問者的瀏 覽器上面,就好像ASP —樣。JSP (Java Server Images)技術有點類似ASP技術,它是在傳統的網頁HTML文件 (*. htm, *· html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件 O. jsp)ο上述三者都提供在HTML代碼中混合某種程序代碼、由語言引擎解釋執行程序代 碼的能力。但JSP代碼被編譯成Servlet並由Java虛擬機解釋執行,這種編譯操作僅在對 JSP頁面的第一次請求時發生。在ASP、PHP、JSP環境下,HTML代碼主要負責描述信息的顯 示樣式,而程序代碼則用來描述處理邏輯。普通的HTML頁面只依賴於Web伺服器,而ASP、 PHP、JSP頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入 到HTML代碼中,然後一起發送給瀏覽器。ASP、PHP、JSP三者都是面向Web伺服器的技術, 客戶端瀏覽器不需要任何附加的軟體支持。(來源百度百科)ASP. NET是ASP的升級平臺,它把基於通用語言的程序在伺服器上運行。不像以前 的ASP即時解釋程序,而是將程序在伺服器端首次運行時進行編譯,執行效果,比一條一條的解釋強很多,執行效率大大的提高。(來源百度百科)ASP. net可以運行在Web應用軟體開發者的幾乎全部的平臺上。通用語言的基本 庫,消息機制,數據接口的處理都能無縫的整合到ASP. net的Web應用中。ASP.net同時也 是language-ind印endent語言獨立化的,所以,用戶可以選擇一種最適合你的語言來編寫 你的程序,或者把用戶的程序用很多種語言來寫,現在已經支持的有C#,VB.NET,JScript. NET, managedC++,J#。(來源百度百科)為實現動態網頁,web伺服器一般將特定的請求頁面,通過特定的接口,轉發至特 定的模塊(或程序)進行處理。現有的web伺服器技術,存在以下問題1.系統過於複雜和龐大,如jsp和asp. net,其本身耗費的資源和複雜度,比web 應用本身可能大許多倍;2.效率低下,如asp,php是解釋型的腳本語言,jsp是偽編譯的虛擬機語言,其運 行速度遠低於c/c++數倍乃至更大。而asp. net雖然號稱能編譯,但其所面向對象的運行 環境本身準備花的代碼,遠遠超過應用本身代碼3.兼容性不佳,如asp. net在windows以外的平臺上,使用非常受限4.系統的獨立性很差,過於依賴太多的組件,如asp. net5.對於技術人員,需要額外關注和學習的東西太大,變化太快,如asp. net6.安全性差,這主要在於1.因系統複雜而致,如asp. net ;2.因代碼是明碼而異 受攻擊,如php和asp ;7.缺乏全局性的訪問控制機制,每個頁面之間的邏輯關係很難控制,或需比較大 的代價,如Php中session的使用;本發明將提出一種web伺服器系統和方法,用於解決以上問題。
發明內容
本發明提供一種動態網頁生成方法,即使用c/c++代碼作為嵌入web頁面的編程 語言,所述c/c++代碼在伺服器端被編譯成二進位機器代碼直接在CPU處運行。同時,本發明還提供一種web伺服器,其具有web伺服器管理的臨時存儲空間,供 多個/次動態頁面中的程式語言代碼共享數據所用,技術方案一種伺服器端動態網頁生成的方法,包括在基於html或xml標記的web頁面中 包含運行於伺服器端的程式語言代碼(通過程式語言標記標識),由伺服器將所述web頁 面內容以及web頁面中包含的程式語言執行結果所形成的內容一起發往客戶端,其特徵在 於所述程式語言是c語言或c++語言,所述c/c++代碼以編譯後的所述伺服器CPU的機器 代碼形式運行。本發明所述的方法,其特徵在於,所述c/c++代碼在第一次運行時被編譯。本發明所述的方法,其特徵在於,將嵌入c/c++代碼的html頁面,轉換為一中間c/ c++原始碼文件,通過現有的專用或通用c/c++編譯器對中間文件進行編譯。所述轉換,可以這樣進行將程式語言標記以外的每段html文本,分別以一條或多條輸出語句(調用一輸出函數)替代,將該段文本(或一部分)作為所述輸出語句所調用函數的參數;將程式語言標記以內的c/c++代碼與上述轉換後的輸出語句代碼按其原來的先 後順序一起構成一函數,函數使用預先定義的名稱和參數定義;為上述轉換後的代碼添加上適當的頭文件或/及系統調用定義;所述編譯結果可以是可執行文件(通過Cgi接口被伺服器調用),或者共享對象 (so) /動態連接庫(dl 1),後者可通過伺服器接口直接調用,也可通過另一被伺服器調用的 模塊所調用。本發明所述的方法,其特徵在於,使用專用的編譯器,直接編譯所述包含c/c++代 碼的html頁面。本發明所述的方法,其特徵在於,所述編譯器內置web伺服器內,或作為伺服器的 一個模塊。本發明所述的方法,其特徵在於,使用另一程式語言標記來標記全局函數或變量, 該標記內的代碼在編譯時,自動被抽出並放置在html文本所在函數的外面/前面。本發明所述的方法,其特徵在於,編譯本發明所述的動態頁面時,還包括將所述 web頁面中對web頁面的處理無意義的字符刪除的步驟,如空格,回車等。本發明所述的方法,其特徵在於,編譯本發明所述的動態頁面時,還包括將所述 web頁面中html或xml標記語言進行壓縮的步驟。如對於原文為text_a的html文本,本 發明所述的方法在編譯時一般按照{char *_t = text_a ;pr(_t) ;}的方式來實現,壓縮可 以這樣進行{char *_t = text_b ;pr (decode (_t)) ;},其中,text_b 是編譯器在編譯時將 text_a 用壓縮而成的,艮口 text_b = encode (text_a);上述刪除無意義的字符以及壓縮的目的,在於減少目標代碼的長度,以加快載入 速度以及減小帶寬佔用。本發明所述的方法,其特徵在於,web伺服器將多個靜態或動態頁面(或動態頁面 編譯後的二進位文件)打包在內存中或某一個文件中的步驟。當用戶請求打包的文件時, web伺服器可以快速的從包中取出,提高I/O效率。所述打包,可以壓縮,也可以不壓縮,其 中前者,對於機械存儲裝置具有比較顯著的意義。通過監視打包前文件的狀態改變,維持打包文件與原始文件數據的一致性。本發明所述的方法,其特徵在於,所述web頁面內的c/c++代碼運行所需要分配的 資源,由web伺服器進行管理並分配,c/c++代碼通過伺服器代碼接口進行調用。該方法主 要用於防止動態頁面錯誤時,造成資源的洩露,如內存,文件句柄(socket)等。本發明所述的方法,其特徵在於,所述c/c++代碼使用標準的c/c++規範以及函數 庫。本發明所述的方法,其特徵在於,所述web頁面內的程式語言是c語言。一種web伺服器,包括生成動態頁面的步驟,即在web頁面中包含運行於伺服器 端的程式語言代碼,由伺服器將所述web頁面內容以及web頁面中包含的程式語言執行結 果所形成的內容一起發往客戶端,其特徵在於,還包括一伺服器調用接口,該接口用於所述 生成動態頁面過程中,供所述web頁面中包含的程式語言代碼所調用,完成如下操作 從所述web伺服器中請一臨時存儲區域,並返回一標誌(id);
所述程式語言代碼將以該id對臨時區域進行訪問;所述臨時存儲區域將在其被最後一次訪問或有效訪問後的某一時間周期後由服 務器自動釋放;所述臨時存儲區域可以被多個/次動態頁面的程式語言代碼以所述id所訪問;所述臨時存儲區域可由所述動態頁面的程式語言代碼釋放(如用戶logout,不再 需要的時候),以節省資源,但不是強制或必須的。因為web頁面的訪問永遠是沒有預期的, 可能於任何時候中止。Web伺服器負責所述臨時存儲區域的管理,在系統臨時存儲區域資源用盡的時候, 其將根據一定的管理策略釋放一些已被佔用的臨時存儲區域,如最後使用或最少使用等。本發明所述的web伺服器,其特徵在於,所述臨時存儲區域位於內存中或外存儲 器的由web伺服器管理的某一特定文件中。該調用接口,主要用於多個相關聯的web頁面之間的安全數據共享,與php和jsp 中的session比較類似,不同的是,php中的session存儲在外存儲器中,而且是以多個文件 的形式,對系統性能的影響比較大,而本發明的一般存儲於內存中,即使存儲於外村,也位 於同一個文件內,訪問速度遠快於不同的文件。(可通過伺服器參數配置大小和存儲方式)技術效果本發明的方法和系統,在效率,安全、易用、性能上與現有的方法和系統相比,有以 下特點1.具有較高的編譯效率和執行速度(c/c++是最接近機器語言的高級語言),同樣 環境下,其代碼的執行速度,是Php和asp的數倍甚至數十倍;2.具有良好的可移植性(c/c++是最標準和規範的計算機語言),基本上,任何平 臺只要有程式語言,幾乎都有c/c++,以及它們的編譯器;3.具有最小的系統依賴性,其目標代碼的運行,除作業系統外,基本沒有任何要求4.具有最大的靈活性,其可以以任何接口,調用任何組件,其本身,也可以構成任 何組件;5.最容易使用,c/c++是計算機領域的基礎語言,會的人最多,無需再去掌握各種 複雜的概念。6.具有很好的安全性(c/c++代碼編譯後是機器代碼)。7.具有最強的調試工具和開發環境,以及資料資源.8. 一般,伺服器代碼都是由c/c++完成,所以,使用c/c++作為動態web頁面的內 嵌語言,與伺服器有著天生契合。以上特點,即構成了本發明所述方法的技術效果。以發明人的實驗(現)為例 (Win32環境,Iinux下會更小),web伺服器的代碼僅36k,專用編譯器(通過改造tiny c) 僅155K,以此為基礎的簡單blog系統示例(不計UI設計時間,編碼/調試2-3天),包括 登錄/發表/修改/瀏覽/上傳等6個頁面,總代碼不到100k (原始碼不到50k),這還是在 未進行任何壓縮的情況下。而該實驗blog以及web伺服器,即使在15-20年前的機器上, 也能很好的運行。本實驗(現)使用c完成(同時也支持c++編譯器的編譯)。
圖1為本發明的所述方法的流程框圖;圖2為本發明的所述方法編譯包含c/c++代碼的web頁面生成中間C語言臨時文 件的流程框圖,其中1030是對103的例子說明,1080是對108和107的例子說明,200-205 是對104過程的說明圖3為本發明的所述方法直接編譯包含c/c++代碼的web頁面的流程框圖,其中 1002可延遲至需要寫入時才打開。圖中,10030是對1003的示例,10080是對1008和1007 的示例下面,結合附圖和實施例進一步說明。 具體實施例本發明所述的方法和系統可以這樣實施1.定義程式語言標記標識,開始標記結束標記%>全局函數/變量開始標記 (與asp碰巧相同,正好便於web編輯器編輯,該標記可任意更改/設定,只需動態 頁面和編譯器一致即可)2.定義web伺服器與動態頁面生成調用函數接口,本實施例定義為int HttpMain (pHTTPREQ pHttpReq),該函數由web伺服器動態調用返回為1表示 成功,0表示失敗其中,pHttpReq為一組與web伺服器輸入輸出及管理有關的函數調用指針,如pHttpReq- > HttpGetCookieStr (char *name, int *cLen) ;cookie 串{tpHttpReq- > Httpffrite (void *buff, int wLen);往客戶端寫內容pHttpReq-> HttpGetEnvStr (char *name,, int vLen);獲得環境變量.....並以此實現伺服器及調用接口,主要步驟如下2. 1偵聽80埠,有用戶請求進入則轉2. 22. 2讀取用戶http請求頭,判斷是否用戶請求的是動態頁面,如果不是,直接讀取 靜態文件,發送給用戶,然後轉2. 1 ;1. 3請求動態頁面的二進位目標代碼存在且新於其文本文件嗎?若是,則轉2. 51.4編譯動態頁面為二進位目標代碼,不成功,報錯,返回2. 1(具體方法後述)1. 5設置相應http環境變量,如cookie,以及pHttpReq調用函數1. 6裝載動態頁面編譯後的二進位目標代碼,並調用HttpMain函數1.7如果函數調用成功,直接返回2. 1,否則,(釋放該頁面申請而未釋放的資源), 報錯後返回2. 13.實現一轉換程序,將嵌入c/c++代碼的html頁面文件a. htc,轉換為純粹的c/ C++代碼文件b. C (或b. cpp),如圖2所示,包括如下步驟
3.1.將a. htc文件讀入內存,並創建文件b. c ;
3.2.寫入 #include 到文件 b. c
3.3.寫入 #include 到文件 b. c, http. h 中定義了 pHTTPREQ
3.4.掃描內存中的文件a.htc,尋找static,找到後記錄位置為pa,未找到,則轉3.9
3.5.從位置pa開始,掃描%>,找到後記錄位置為Pb,未找到,出錯,退出
3.6.將位置pa和pb之間的c/c++代碼寫入文件b. c中
3.7.將pa和pb之間的內容(包括開始和結束標誌)刪除;
3.8.重複3. 4-3. 7的步驟;
3.9.寫入 int HttpMain (pHTTPREQ pHttpReq) {到文件 b. c
3.10.設置pa位置為內存中的文件a. htc的開始;
3.11.從Pa位置開始掃描內存中的文件a. htc,尋找< %,找到後記錄位置為pb,未找到,則轉3. 16
3.12.將pa和pb之間的html內容以如下方式寫入文件b. c {char*_t = 」 ... 」,pr (_t);},其中,...為html中相應部分,pr為系統定義的輸出函數*
3.13.尋找%>,找到後記錄位置為pc,未找到,出錯,退出
3.14.將pb和pc之間的c/c++代碼寫入文件b. c中
3.15.令pa = pc,重複3. 11-3. 14的步驟
3.16.將pa到內存中的文件a.htc結束的html內容以如下方式寫入文件b. c{char*_t=」...」,pr(_t) ;},其中,...為html中相應部分,pr為系統定義的輸出函數*
3.17.將return 1 ;}寫入文件b. c
3.18.關閉文件b. c,轉換結束
* 如#define pr (a) pHttpReq- > Http Write(a, strlen (a))
4.編譯b. c,本實施例使用tiny c編譯器,即tcc-shared b. c_o a. dll,則產生
a. dll(linux下為a. so,共享對象)如果編譯正確,則刪除中間文件b. C,否則,對照b. c查找錯誤上述轉換程序和tcc可以通過伺服器直接調用,通過以上方法,我們對本發明做了簡單的原理性實現,我們可以通過以下的改進, 進一步完善上述實施例 將伺服器改為多線程,即將2. 2-2. 7的步驟,開闢一個線程進行; 將3中的轉換程序與tcc結合為一體,使tcc可以直接編譯包含c/c++代碼的 html文件,如上述的a. htc,即tcc自動判斷輸入文件的類型,當判定是.htc類型時,自動 生成中間文件,並將中間文件編譯為a. dll,然後刪除中間文件 進一步,我們可以將tcc編譯器做進一步的改進,不產生中間文件,即直接按上 述步驟3中的邏輯,將htc文件中的各部分編譯成對應的代碼,並連接成最終的dll (或so) 文件,如圖3所示。直接編譯的好處,在於速度更快,而且,一旦出錯,可以更好的發現出錯 的地方。 再進一步,我們可以將tcc直接加入到web伺服器代碼中去當然,上述實現也可以應用在現有的web伺服器上,如Apache和IIS,具體如下
編寫一個使用ISAPI接口的htc頁面請求處理模塊,在該模塊中完成上述步驟 2. 3-2. 7的過程,這樣,可以很容易的將本發明實現到現有的大部分web伺服器上。如果不使用動態連接庫(或共享對象),而使用傳統的main函數調用,可以以 CGI方式的接口進行,但效率和功能將受限。CGI接口是很成熟的方式,本發明不做過多敘 述。本發明所述的web伺服器,臨時存儲區域可以這樣來實現,其接口可以對現有的 web伺服器的接口進行增加,如對於本發明的支持動態頁面的web伺服器(http伺服器)而 言,只需在pHttpReq指針結構中多定義幾個函數指針即可,而對於IIS或Apache類的web 伺服器,則可以通過對其都支持的ISAPI接口進行擴充,以增加接口調用。web伺服器內可以這樣來實現,定義每個臨時存儲區域的大小為64位元組,則 1000000萬用戶,需要64M內存的存儲空間,這對目前的伺服器內存而言,屬於比較小的開 銷。typedef struct_tagtempMem{UINT32 rand ;//伺服器產生的隨機數。供安全驗證之用time_t last_access_t //最有訪問時間/有效訪問時間Strcut *_tagtempMem pNext, pPrev ; //雙向鍊表char username[16] ; //用戶名char userdata[32] ; //用戶數據;} TEMPMEM,*pTEMPMEM ;TEMPMEM tmpMem[ 1000000];這1百萬個臨時存儲空間以兩個雙向鍊表進行組織,一個是已經使用的 pUsedHead/pUsedTail,一個是尚未使用的pEmpty(Web伺服器啟動時完成),對於釋放的臨 時存儲空間,可以直接加到PEmpty的鏈頭,而對於每次使用/訪問的鍊表,則自動將之由當 前的位置,移動至pUsedHead,這樣,pUsedTail則總是最久未使用的臨時存儲空間,需要釋 放的時候,即從尾部釋放即可。本實施例設定過期的時間為20分鐘,即20分鐘該臨時存儲空間沒被訪問,其可能 在系統臨時存儲空間不夠分配的時候被釋放。本實施例所需的函數定義如下UINT StartTempMem(char *username);對用戶 username分配一臨時存儲空間,返 回ID本例中,返回的ID等於該臨時存儲空間的下標號,或該下表號加上一固定的數 字,當然,返回的ID也可以是指向該臨時存儲空間的內存地址。int ISiTempMem(UINT id, char *username);所述 id 對應的臨時存儲空間還有效 嘛?如果有效,則更新iast_access_t數據,返回1,否者,返回0 ;char *GetTempMemStr(UINT id, int index);獲得臨時存儲空間字符串數據,如 username/userdata ^ ;int SetTempMemData (UINT id, int index, void *data, int datasize);存儲臨 時存儲空間數據
UINT GetTempMemInt (UINT id, int index);獲得臨時存儲空間整數數據,如rand 數據,userdata空間大小等Int EndTempMem(UINT id, char *username);釋放臨時存儲空間;通過上述方式,可實現本發明所述的web伺服器。由於c比c++具有更廣的使用範圍,也具有更好的效率和更簡單的語法,因而本發 明更建議使用c語言作為動態頁面的嵌入程式語言。本發明中暫以.htc後綴表示包含c/c++代碼的web頁面文件,以.htd後綴表示 包含c/c++代碼的web頁面被編譯後文件。本發明中c/c++的含義為c或C++。
權利要求
1.一種伺服器端動態網頁生成的方法,包括在web頁面中包含運行於伺服器端的編 程語言代碼,由伺服器將所述web頁面內容以及web頁面中包含的程式語言執行結果所形 成的內容一起發往客戶端,其特徵在於所述程式語言是c語言或c++語言;所述程式語言代碼以編譯後的機器代碼形式運行。
2.按照權利要求1所述的方法,其特徵在於,所述c/c++代碼在第一次運行時被編譯。
3.按照權利要求1所述的方法,其特徵在於,還包括將包含c/c++代碼的web頁面,轉 換為一中間c/c++代碼,通過現有的專用或通用c/c++編譯器對中間代碼進行編譯。
4.按照權利要求1所述的方法,其特徵在於,使用專用的編譯器,直接編譯所述包含c/ c++代碼的web頁面。
5.按照權利要求1所述的方法,其特徵在於,所述編譯器代碼內置於與web伺服器代碼 內,或作為web伺服器代碼的一個模塊。
6.按照權利要求1所述的方法,其特徵在於,所述動態頁面被編譯後的機器代碼以動 態連接庫或共享對象的方式為web伺服器所動態裝入並調用。
7.按照權利要求1所述的方法,其特徵在於,還包括使用另一程式語言標記來標記全 局函數或變量,該標記內的代碼在編譯時,自動被抽出並放置在當前函數的前面或外面。
8.按照權利要求1所述的方法,其特徵在於,所述web頁面內的c/c++代碼運行所需要 分配的資源,由web伺服器進行管理並分配。
9.一種web伺服器,包括生成動態頁面的步驟,即在web頁面中包含運行於伺服器端 的程式語言代碼,由伺服器將所述web頁面內容以及web頁面中包含的程式語言執行結果 所形成的內容一起發往客戶端,其特徵在於,還包括一伺服器調用接口,該接口用於所述生 成動態頁面過程中,供所述web頁面中包含的程式語言代碼所調用,完成如下操作 從所述web伺服器中請一臨時存儲區域,並返回一標誌(id); 所述程式語言代碼將以該id對臨時區域進行訪問;所述臨時存儲區域在其被最後一次訪問或有效訪問後的某一時間周期後由伺服器自 動釋放;所述臨時存儲區域可以被多個/次動態頁面的程式語言代碼以所述id進行訪問;所述臨時存儲區域可由所述動態頁面的程式語言代碼釋放,但不是強制或必須的。
10.如權利要求9所述的web伺服器,其特徵在於,所述臨時存儲區域位於內存中。
全文摘要
用於web伺服器的方法和系統,該方法和系統用於更好的控制web伺服器的性能與效率,包括一種動態網頁生成方法,即使用c或c++代碼作為嵌入web頁面的程式語言,所述c/c++代碼在伺服器端被編譯成二進位機器代碼直接在cpu處運行,所述c/c++代碼在第一次運行時被編譯,同時提供了編譯所述動態頁面所需的方法以及提高基於動態頁面的伺服器的優化方法,包擴在伺服器內設置臨時存儲空間,對靜態頁面或動態頁面打包等。
文檔編號G06F17/30GK102141991SQ20101010368
公開日2011年8月3日 申請日期2010年2月2日 優先權日2010年2月2日
發明者鍾巨航 申請人:鍾巨航