將程序輸出為其他的語言是程序員喜愛的事情之一,在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"文件如下:
================================================
<script>
lines=new Array();
function displaymsgs() {
for(i=0;i<lines.length;i++) {
display.document.write(lines[i]);
display.document.write(<BR>);
}
}
</script>
<frameset cols="1" rows="20,60,20" border="0">
<frame name="loader" src="loader.php">
<frame name="display" src="display.php">
<frame name="form" src="form.php">
</frameset>
==================================================
註:"form"文件是發言框,提供用戶輸入發言框。
"display"文件內容:
=====================
<script>
top.displaymsgs();
</script>
====================
"display"文件是不是很小? 🙂
"loader"文件:
====================
<?php
session_start(); // 在這使用 Sessions !
if(!isset($timestamp)) {
//如果"timestamp"沒有定義,則定義並設為0
$timestamp