给你一篇文章看一下,有参考的。PHP & JavaScript控制系列:客户端数据存储   所有程序员都喜欢做的一件事就是编写一个可以生成程序的程序。在web 上 
,我们面临两种不同的开发环境:客户端(浏览器)和服务端。根据HTTP协议的 
定义,就可以在服务端编写一个程序,这个程序输出一个使用了另一种可以在客 
户端执行的语言的程序。让我们选择PHP(当然的了)编写服务端程序,选择Jav 
aScript来编写客户端程序。在这篇文章中,要向你演示如何通过这种组合在客户 
端存储数据并且使得服务器与浏览器之间的数据交换达到最少,以用在一些交互 
的应用中,如聊天室、新闻系统或你想得到的什么东西。  要素: PHP4  
JavaScript  
Frames  想法: 
  我们将暂时试着开发一个用PHP 编写的HTTP聊天室程序。对于聊天来说,HT 
TP不是一个很好的协议,但是它对防火墙和代理服务器有免疫力,我们可以允分 
发挥PHP的潜力,并且不需要Java Applet。对于聊天室程序有两个主要的问题: 
第一个就是,IE不支持“推”的方法,这样就需要把它做成一个全“拉”的应用 
程序(指客户端自动刷新),这一点对于一个聊天程序不是很自然。我们打算让 
客户端的刷新时间是可调的,服务器将根据前x 分钟内一个位于服务器的用于接 
收消息数据的函数结果生成刷新时间。第二个问题要难解决一些:因为采用自动 
刷新的方法,这样每一次服务器都需要将所有的信息发给客户端,我们估计会造 
成大量的传输。并且我们所做的一个模拟简单的聊天室模型的样板程序也显示这 
就是造成聊天延时的主要原因。本文处理了第二个问题和更深的问题。  普通模型:   通过使用帧,可以刷新一个特定的帧而不需要重新装入其它帧,这个对于最 
少化c/s 传输很有用。我们的模型基于下面的设计:  
主文件,用来定义帧结构。装入帧文件。显示帧文件。    在我们的设计中,装入帧每“x” 秒自动刷新,想法是将数据保存在主文件 
中,允许装入帧文件向服务器请求客户端还未收到的数据。我们使用时间戳来标 
记消息,新闻或可传输的东西,并且通过它可以知道哪一个需要传给客户端,哪 
一个不需要。我们使用PHP4的session 功能将“最后的时间戳”保存在客户端以 
便在服务器它也是可见的。当装入帧文件接收到数据时,数据被保存在主文件里 
(注意,主文件可能很大,但是它只传输一次),然后让显示帧文件刷新。为了 
进一步优化,我们让显示帧文件尽可能的短,在这帧里,只是调用一个“displa 
y”的JavaScript 函数,这个函数明显被保存在主文件中,这个函数使用保存在 
主文件中的数据来动态绘制显示帧。让我们看一下这个方法:  浏览器请求主文件(帧结构) 主文件从服务器被传输过来,它定义了帧结构,然后其它的帧(装入帧和显示帧 
)被传输。  
装入帧文件在服务器被分析,如果客户端没有“timestamp”session 变量,它就 
将所有的数据从服务器上取回,并且生成JavaScript代码将数据存在主文件中。 
然后设置“timestamp”session变量。然后装入帧文件生成JavaScript代码使客 
户端刷新显示帧文件。  
这个刷新引起显示帧文件调用“display”函数,这个函数根据数据生成显示帧。 
每“x”秒我们回到(2)  我们对这个方法的分析如下:  我们要三个文件:  主文件 : (很大,包含显示代码和保存的变量和初始值)  
装入帧文件 : (小,包含php代码,用于从服务器取回数据和生成JavaScript代码 
)  
显示帧文件 : (非常小,只有一个对主文件中的显示函数的调用)  主文件只被传输一次。 
装入帧文件和显示帧文件每“x”秒被传输一次。 
装入帧文件可能在第一次被调时大一些,然后因为每次只取回客户端未取过的数 
据,它就变得很短了。 
显示帧文件也是一样。  
由于显示结果是在客户端被处理的,我们就减少了服务器数据的装入。  糊涂了吗?还是让我们看一看例子吧:    在这个例子里,我们建了一个聊天室,它还不能真正使用,只是用来演示如 
何实现我们的模型,请不要提出“为什么不在聊天室里加上这个或加上那个功能 
”之类的要求。如果发现这个模型有用,你可以利用它建立一个满足你的要求的 
足够复杂的聊天室来,同时请记住,它不只是能够用来建聊天室。 行动!   请使用mysql创建一个测试数据库(mysqladmin create testbase),然后创 
建一个表: --------------------------------------------------------------------- create table testeable ( 
    timestamp datetime, 
    message   text 
); 
--------------------------------------------------------------------- 
  这是主文件:  --------------------------------------------------------------------- <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”函数,在这里你可以根 
据你的想法使用颜色、动态颜色、用户信息,html表格,图像,等等。   显示帧文件为: 
--------------------------------------------------------------------- <script> 
    top.displaymsgs(); 
</script> 
---------------------------------------------------------------------   我们保证过的,它会很短的 :-)   接下来就是装入帧文件: 
--------------------------------------------------------------------- <?php  session_start();   
// 在这儿我们使用了session  
if(!isset($timestamp)) {  
    //如果没有timestamp(时间戳)我们把它定义为0  
    $timestamp=0;      
}  
$dab=mysql_connect("localhost", "user", "password"); 
// 在这里使用你自已的值mysql_select_db( "testbase",$dab);  // 查询信息不会被客户端看见$query= "select * from testeable where time 
stamp>'$timestamp'";  
$result=mysql_query($query,$dab);  
$msgs=array();  // 在循环中,我们将对话信息存在一个数组中,并且得到最大的时间戳 
while($res=mysql_fetch_array($result)) {  
    $msgs[]=$res[ "message"];      if($res["timestamp"]>$timestamp) {  
        $timestamp=$res["timestamp"];     }  
}  
session_register( "timestamp");   
// 注册时间戳 
echo  '<script>';  
// 在这个循环中,我们生成JavaScript代码用来向主文件(注意使用"top"来 
指// 向代表主文件的父帧)中的数组增加对话信息 
    for($i=0;$i<$count($msgs);$i++) {  
?>  
    top.lines[top.lines.length]="<?php print("$msgs[$i]"); ?>";  
<?php  
}   
// 现在我们将生成JS代码来使显示帧重新装入 
?>  
top.display.location.reload();  
</script>  
<!-- 注意JS的setInterval方法用来让帧每4秒钟重装一次 --> 
<body onLoad="window.setInterval('location.reload()',4000);">  
</body> 
--------------------------------------------------------------------- Ok, 然后是用于测试目的“form”帧: 
--------------------------------------------------------------------- <?php  
session_start();  
if (!isset($timestamp)) {  
  $timestamp=0;  
}  
// 显示表单,使用JavaScript来得到最后的时间戳 
if (isset($msg)) {  
    $dab=mysql_connect("localhost", "root", "seldon");  
    mysql_select_db("testbase",$dab);  
    $query= "insert into testeable(timestamp,message) values(now(),'$m 
sg')";  
    mysql_query($query,$dab);  
    // 现在得到在last_time之后的所有聊天对话 
    $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");  
    // 现在我有了最大的时间戳,使用JavaScript,我们可以设置这些值 
?>  
<script>  
<?php  
for($i=0;$i<$count($msgs);$i++) {  
?>  
    top.lines[top.lines.length]="<?print("$msgs[$i]");?>";  
<?php  
  }  
?>  
    top.display.location.reload();  
</script>  
<?php  
}  
?>  
<form name="foo" action=" <?php print("$PHP_SELF"); ?>" method="post"> 
  
Message:<input type="text" name="msg">   <input type="submit" name="ne 
wmsg" value="send">  
</form> 
---------------------------------------------------------------------   注意,我们根据"form"帧来刷新显示,这对用户很好,因为一旦他提交了 
他的信息就会被马上看见。用户喜欢这样,因为它在聊天室中增加了一些动态机 
制。你也看到了,form帧与装入帧非常象。    我们向你展示了一个极为有用的技术,它通过将数据保存在客户端从而减少 
了c/s间的传输量,并且在客户执行一个复杂的显示操作时减少了从服务器的信息 
装入。现在你有了能力,去征服世界吧!