top
Loading...
PHP&JavaScript控制系列:客戶端數據存儲(一)

所有程序員都喜歡做的一件事就是編寫一個可以生成程序的程序。在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”秒被傳輸一次。
裝入幀文件可能在第一次被調時大一些,然后因為每次只取回客戶端未取過的數據,它就變得很短了。
顯示幀文件也是一樣。
由于顯示結果是在客戶端被處理的,我們就減少了服務器數據的裝入。

糊涂了嗎?還是讓我們看一看例子吧:

在這個例子里,我們建了一個聊天室,它還不能真正使用,只是用來演示如何實現我們的模型,請不要提出“為什么不在聊天室里加上這個或加上那個功能”之類的要求。如果發現這個模型有用,你可以利用它建立一個滿足你的要求的足夠復雜的聊天室來,同時請記住,它不只是能夠用來建聊天室。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗