所有程式設計師都喜歡做的一件事就是寫一個可以產生程式的程式。在web 上,我們面臨兩種不同的開發環境:客戶端(瀏覽器)和服務端。根據HTTP協定的定義,就可以在服務端寫一個程序,這個程序輸出一個使用了另一個可以在客戶端執行的語言的程序。讓我們選擇PHP(當然的了)來編寫服務端程序,選擇JavaScript來編寫客戶端程式。在這篇文章中,要向你演示如何透過這種組合在客戶端儲存資料並且使得伺服器與瀏覽器之間的資料交換達到最少,以用在一些互動的應用程式中,如聊天室、新聞系統或你想得到的東西。
要素:
PHP4
JavaScript
Frames
想法:
我們將暫時嘗試發展一個用PHP 寫的HTTP聊天室程式。對於聊天來說,HTTP不是一個很好的協議,但是它對防火牆和代理伺服器有免疫力,我們可以允分發揮PHP的潛力,並且不需要Java Applet。對於聊天室程式有兩個主要的問題:第一個就是,IE不支援「推」的方法,這樣就需要把它做成全「拉」的應用程式(指客戶端自動刷新),這一點對於一個聊天程式不是很自然。我們打算讓客戶端的刷新時間是可調的,伺服器將根據前x 分鐘內一個位於伺服器的用於接收訊息資料的函數結果產生刷新時間。第二個問題要難解決一些:因為採用自動刷新的方法,這樣每一次伺服器都需要將所有的資訊發給客戶端,我們估計會造成大量的傳輸。而我們所做的一個模擬簡單的聊天室模型的樣板程式也顯示這就是造成聊天延遲的主要原因。本文處理了第二個問題和更深的問題。
普通模型:
透過使用幀,可以刷新一個特定的幀而不需要重新裝入其它幀,這個對於最少化c/s 傳輸很有用。我們的模型是基於下面的設計:
主文件,用來定義框架結構。
裝入框架檔案。
顯示畫面檔案。
在我們的設計中,裝入幀每“x” 秒自動刷新,想法是將資料保存在主文件中,允許裝入幀文件向伺服器請求客戶端還未收到的數據。我們使用時間戳來標記訊息,新聞或可傳輸的東西,並且透過它可以知道哪一個需要傳給客戶端,哪一個不需要。我們使用PHP4的session 功能將「最後的時間戳記」保存在客戶端以便在伺服器它也是可見的。當裝入訊框檔案接收到資料時,資料會被保存在主檔案中(注意,主檔案可能很大,但它只傳輸一次),然後讓顯示訊框檔案刷新。為了進一步優化,我們讓顯示幀檔案盡可能的短,在這幀裡,只是呼叫一個「display」的JavaScript 函數,這個函數明顯被保存在主檔案中,這個函數使用儲存在主檔案中的資料來動態繪製顯示幀。讓我們來看看這個方法:
瀏覽器請求主檔案(幀結構)
主檔案從伺服器傳送過來,它定義了幀結構,然後其它的幀(裝入幀和顯示幀)被傳輸。
裝入訊框檔案在伺服器被分析,如果客戶端沒有「timestamp」session 變量,它就將所有的資料從服務
器上取回,並且產生JavaScript程式碼將資料存在主檔案中。然後設定“timestamp”session變數。
接著裝入幀檔案產生JavaScript程式碼使用戶端刷新顯示幀檔案。
這個刷新引起顯示幀檔案呼叫「display」函數,這個函數根據資料產生顯示幀。
每「x」秒我們回到(2)
我們對這個方法的分析如下:
我們要三個檔案:
主檔案(很大,包含顯示程式碼和儲存的變數和初始值)
裝入幀檔案(小,包含php程式碼,用於從伺服器取回資料和產生JavaScript程式碼)
顯示幀檔案(非常小,只有一個對主檔案中的顯示函數的呼叫)
主檔案只被傳輸一次。
裝入幀檔案和顯示幀檔案每「x」秒傳送一次。
裝入幀檔案可能在第一次被調時大一些,然後因為每次只取回客戶端未取過的數據,它就變得很短了。
顯示畫面檔案也是一樣。
由於顯示結果是在客戶端被處理的,我們就減少了伺服器資料的裝入。
糊塗了嗎?還是讓我們來看看例子吧:
在這個例子裡,我們建造了一個聊天室,它還不能真正使用,只是用來示範如何實現我們的模型,請不要提出「為什麼不在聊天室裡加上這個或加上那個功能」之類的要求。如果發現這個模型有用,你可以利用它來建立一個滿足你的要求的足夠複雜的聊天室來,同時請記住,它不只是能夠用來建造聊天室。