php服务器推技术的聊天室

发布时间:2020-01-08编辑:脚本学堂
本文介绍下,php推技术实现的聊天室的例子,有需要的朋友参考下吧。
基于前面的讨论,就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室:
页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form。

这样,在第一个frame的脚本中:
 

复制代码 代码示例:
<?php
ob_end_clear();//关闭缓存
set_time_limit(0);
ob_implicit_flush(); //这个语句将强制每当有输出就自动刷新,相当于在每个echo后,调用flush()
$new_mesg = NULL;
register_tick_function("getNewMesg");
declare(ticks=1){
  while(1){
     if(!is_null($new_mesg)){
         foreach($new_mesg as $msg){
            echo $msg;
         }
          $new_mesg = null;
    }
  }
}
function getNewMesg(){
//通过查询数据库,或者共享内存,来获取现在的聊天室大厅的内容。
//返回一个数组,包含所有的新的聊天内容
}
?>

这样就实现了一个简单的使用服务器推技术的聊天室的框架。

当然,关于实时输出,还有一些其他的限制,比如在PHP5手册中讲到的:
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。
例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

一个有趣的代码,有兴趣的朋友,可以研究下:
 

复制代码 代码示例:
<?php
header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
print "endofsection";
for( $i = 0; $i <10;$i ++ )
{
 sleep(1);
 print "Content-type: text/plain ";
 print "Part $i ";
 print "--endofsection ";
 ob_flush(); //强制将缓存区的内容输出
 flush(); //强制将缓冲区的内容发送给客户端
}  //by www.jb200.com
print "Content-type: text plain ";
print "The end ";
print "--endofsection-- ";
?>

试试使用firefox打开,能看到什么结果?!
这个例子,使用了ob_flush(), 这样可以在代码中控制缓存区内容的输出时机,更加灵活一些。

有关 php推技术的相关内容,就介绍到这吧,希望可以帮助到大家。