最小化資料轉送——在用戶端儲存資料
來源:互聯網
上載者:User
關鍵字
最小化資料轉送——在用戶端儲存資料
將程式輸出為其他的語言是程式員喜愛的事情之一,在WEB上我們有
兩個不同編程環境:用戶端(瀏覽器)和伺服器端,根據HTTP協議的定義,
我們可以在編寫在用戶端輸出其他語言的服務端程式,我們選擇了作為服
務端語言、javascript作為用戶端輸出。在本問中我們將向您示範這樣用
該方案把資料存放區在用戶端,並且在諸如:聊天室、新聞系統或其他您想
實現的應用上達到服務端和用戶端(瀏覽器)的最小的資料轉送。
要求以下支援:
php4
Javascript
Frames
主要思想:
我們一直試圖用PHP開發一個基於HTTP協議的聊天室(HTTP CHAT ROOM),
儘管對聊天來說HTTP協議並不是個好協議,但是它可以不受防火牆或代理影響,
PHP完全可以實現該功能而不必使用JAVA APPLETS,對於聊天室主要有兩個問題:
第一、由於IE 不支援SERVER PUSH 技術,所以我們只有用CLIENT PULL技術(既
用戶端自動重新整理),第二個問題就更深一層了:因為該思想是在用戶端重新整理,所以服
務端每次必須傳送所有的訊息,這意味著大量的資料轉送,這也正是聊天室延遲的主
要原因,本文試圖解決該問題:
使用架構技術(frames) 你能夠重新整理指定頁面,而不必重新裝載別的頁面,這可
以減少服務/用戶端(C/S)資料轉送量。我們的模型就是基於該方案。
"master"檔案:定義架構結構
"loader"頁面:匯入資料
"display"頁面:顯示資料
在該方案,"loder"框每"x"秒自動重新整理一次——我們的思想是把資料存放區在"master"
檔案內,這樣"loder"頁面只要向服務端請求用戶端所沒有的資料就可以了我們使用時間戳標(timestamp)
記每個訊息來決定那些訊息必須傳給用戶端那些不必傳輸。我們使用PHP4。0的會話管理(session)
儲存用戶端的最後更新的時間戳記(last timestamp)以使時間戳記對服務端和用戶端均可見。當"loader"檔案
從"master"檔案收到資料(注意:"master"檔案很大,但是它只傳送一次)時,就重新整理顯示頁("diaplay")
而"display"頁只是簡單的調用"master"檔案的名為"displaymsgs()"的javascript 函數顯示訊息。該函數動態顯示
儲存在"master"檔案的資料,以下是大體流程圖:
1。瀏覽器請求"master"頁(架構),"master"頁從伺服器端傳送到用戶端(瀏覽器),然後"master"
檔案產生架構,並且將"loader"和"display"頁調到用戶端。
2。在服務端,"loader" 檔案將分析:如果用戶端沒定義"timestamp" session 變數,"loder"檔案將
從服務端得到所有資料,並產生javascript代碼將資料存入"master"檔案,然後將"timestamp"變數存為
session 變數。
3。"loder"頁面產生javascript 代碼重新整理 "display"頁面。
4。重新整理請求使得"display"頁面調用"diaplaymsgs()"javascript 函數顯示資料
5。每隔"x" 秒回到步驟2
我們可以該思想如下:
========================================================
"master"檔案:非常大,定義了displaymsgs() 函數和儲存資料和初始值。
"loader"檔案:小,從服務端取回資料,產生javascript 代碼
"display"檔案:非常小,調用"master"檔案的"diaplaymsgs()"函數
=========================================================
註:“master"檔案只傳送一次
"loder" 和 "display" 檔案每隔"x"秒重新整理一次
第一次傳送的時候"loder"可能會很大,但以後就會很小
"diaplay"檔案一直不變
如果您對以上的思路還是不太清楚的話,以下我們將建立一個聊天室具體講解該方法,這個聊天室只是為了簡單的示範
所以可能並不是很有用,但是您完全可以使用該思想建立更複雜的聊天室,記住這個思想並不是只用與聊天室 。:)
首先請您使用MySQL資料庫表單:
============================
create table testeable (
timestamp datetime,
message text
);
============================
"master"檔案如下:
================================================
==================================================
註:"form"檔案是發言框,提供使用者輸入發言框。
"display"檔案內容:
=====================
====================
"display"檔案是不是很小? :)
"loader"檔案:
====================
session_start(); // 在這使用 Sessions !
if(!isset($timestamp)) {
//如果"timestamp"沒有定義,則定義並設為0
$timestamp=0;
}
$dab=mysql_connect("localhost","user","passWord"); // 開啟資料庫
mysql_select_db("testbase",$dab);
// 尋找用戶端所沒有的資訊
$query="select * from testeable where timestamp>'$timestamp'";
$result=mysql_query($query,$dab);
$msgs=array();
// 在這個迴圈,我們儲存最新訊息/資料,並設定"timestamp"為當前最大值
while($res=mysql_fetch_array($result)) {
$msgs[]=$res["message"];
if($res["timestamp"]>$timestamp) {
$timestamp=$res["timestamp"];
}
}
session_register("timestamp"); // 註冊"timestamp"變數
echo '
=======================================
"form"頁面:
====================
session_start();
if (!isset($timestamp)) {
$timestamp=0;
}
// 顯示表單,產生"timestamp"變數.
if (isset($msg)) {
$dab=mysql_connect("localhost","root","seldon");
mysql_select_db("testbase",$dab);
$query="insert into testeable(timestamp,message) values(now(),'$msg')";
mysql_query($query,$dab);
// 得到timestamp 後的所有訊息
$query="select * from testeable where timestamp>'$tt'";
$result=mysql_query($query,$dab);
$msgs=array();$i=0;$timestamp=0;
while($res=mysql_fetch_array($result)) {
$msgs[]=$res["message"];
if($res["timestamp"]>$timestamp) {
$tt=$res["timestamp"];
}
}
session_register("timestamp");
?>
}
?>
=====================================================
註:我們使得在"form"頁提交發言時,馬上重新整理"display"頁面,這可以達到對發言人來說馬上發言馬上
顯示,更體現即時性。
正如您所看到的,這個聊天室很簡單,這就是最小化客戶/服務(C/S)資料轉送技能,使用這個技術您可以達到最
小的資料轉送,再次提醒您:該技術並不是這用於聊天室!
=======================================================
以上在win98+apache1.3+php4.03平台測試通過!
如有建議或疑問請和飛揚社區聯絡(http://feiyschool.51.net)
或者發EMAIL到feiyhy@sina.com
請您多多賜教,謝謝!
===============================
英文原作者:Luis Argerich, Alejandro Mitrou
英文原文所在網址:http://www.phpbuilder.com
【本文著作權歸作者與奧索網共同擁有,如需轉載,請註明作者及出處】