首页 > php教程 > php手册 > 正文

采用PHP实现”服务器推”技术的聊天室

php中文网
发布: 2016-06-06 19:55:07
原创
1065人浏览过

传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换。 本文将通过结合Ticks(可以参看我的另外一篇文章: 关于PHP你可能不知道的-PHP的事件驱动化设计 ),来实现一个服务器推的PHP聊天室简单构想。 PHPer,尤其是用过set_coo

   传统的b/s结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换。
  本文将通过结合ticks(可以参看我的另外一篇文章:关于php你可能不知道的-php的事件驱动化设计 ),来实现一个服务器推的php聊天室简单构想。

  PHPer,尤其是用过set_cookie, header的,一定见过这样的提示信息:"Warning: Cannot modify header information - headers already sent by…..", 这是因为通过HTTP协议通信,数据包会包含俩个部分,一个是Header,一个是data。一般来说,都是先Header部分,在Heaer部分指明了 Data部分的长度,然后使用/r/n/r/n来表示header部分结束,接下来是Data部分。

  当我们有任何输出的时候,Header部分就发送了,这个时候,你再想header函数来改变一些Header部分的域信息,就会得到上面的提示信息。
  
   一个简单的办法就是使用output_buffering。让它来缓存服务器的输出,不要太早将Header部分发给客户端。

   那么,如果不使用output_buffering,是不是就可以实现,每当服务器有输出,就立即发送给客户端呢?

   做个如下试验:

采用PHP实现”服务器推”技术的聊天室//设置php.ini中output_buffering=0 或者使用ob_end_flush()关闭缓存
采用PHP实现”服务器推”技术的聊天室

采用PHP实现”服务器推”技术的聊天室
set_time_limit(0);
采用PHP实现”服务器推”技术的聊天室
for($i=0;$i10;$i++){
采用PHP实现”服务器推”技术的聊天室  
echo "Now Index is :". $i;
采用PHP实现”服务器推”技术的聊天室  
sleep(1);
采用PHP实现”服务器推”技术的聊天室}

立即学习PHP免费学习笔记(深入)”;

 

广州礼品采购平台
广州礼品采购平台

具有功能全面实用、安全性稳定性高、易操作、管理维护简单 的特点,采用独创的智能型技术,web服务器、数据库和应用程序全 部自动傻瓜安装配置。 管理员可以为客户推荐产品和更新所推荐的 礼品商品。本系统比较适合做礼品商品。 界面简洁大方。后台管理方便,分类可以无限级别。产品添加 简单。

广州礼品采购平台 0
查看详情 广州礼品采购平台

  结果我们发现,还是要等到脚本全部执行完以后,才能一次看到所有的结果。。

 

  为什么呢?

 

  这是因为我们只是解决了缓存问题,但是还有一个缓冲问题,PHP会缓冲程序的输出。所以,这个时候,我们还需要调用,flush(), 来强制使得PHP将所有的程序输出发送给客户端。

采用PHP实现”服务器推”技术的聊天室//设置php.ini中output_buffering=0
采用PHP实现”服务器推”技术的聊天室
ob_end_flush();//关闭缓存
采用PHP实现”服务器推”技术的聊天室

采用PHP实现”服务器推”技术的聊天室
set_time_limit(0);
采用PHP实现”服务器推”技术的聊天室
for($i=0;$i10;$i++){
采用PHP实现”服务器推”技术的聊天室  
echo "Now Index is :". $i;
采用PHP实现”服务器推”技术的聊天室  
flush();
采用PHP实现”服务器推”技术的聊天室  
sleep(1);
采用PHP实现”服务器推”技术的聊天室}

 

    现在是不是看到了,不断有服务器的数据显示出来?

 

    有几个概念之间的关系,我这里补充以下:

 

    在代码中使用ob_start(), 就相当于在php.ini中使用output_buffering=on一样,使用服务器缓存。

 

    在代码中使用ob_end_flush() 就相当于在php.ini中使用output_buffering = false一样,关闭服务器缓存。

 

   

 

     基于前面的讨论,我们就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室: 页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form. 这样,在第一个frame的脚本中:

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

采用PHP实现”服务器推”技术的聊天室
}
采用PHP实现”服务器推”技术的聊天室

 

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

 

 当然,关于实时输出,还有一些其他的限制,比如在PHP5手册中讲到的:

 

采用PHP实现”服务器推”技术的聊天室个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
采用PHP实现”服务器推”技术的聊天室
采用PHP实现”服务器推”技术的聊天室有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
采用PHP实现”服务器推”技术的聊天室
采用PHP实现”服务器推”技术的聊天室甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 
table> 标记之前,不会显示出整个表格。
采用PHP实现”服务器推”技术的聊天室
采用PHP实现”服务器推”技术的聊天室一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
采用PHP实现”服务器推”技术的聊天室

 

 接下来,我贴一个很有趣的代码,有兴趣的同学,可以试试:

采用PHP实现”服务器推”技术的聊天室
采用PHP实现”服务器推”技术的聊天室
header(Content-type: multipart/x-mixed-replace;boundary=endofdiv);
采用PHP实现”服务器推”技术的聊天室
print " –endofdiv ";
采用PHP实现”服务器推”技术的聊天室
$pmt = array("-", "/", "|", "/" );
采用PHP实现”服务器推”技术的聊天室
for$i = 0$i 10;$i ++ )
采用PHP实现”服务器推”技术的聊天室{
采用PHP实现”服务器推”技术的聊天室        
sleep(1);
采用PHP实现”服务器推”技术的聊天室        
print "Content-type: text/plain ";
采用PHP实现”服务器推”技术的聊天室        
print "Part $i ".$pmt[$i % 4];
采用PHP实现”服务器推”技术的聊天室        
print "–endofdiv ";
采用PHP实现”服务器推”技术的聊天室        
ob_flush(); //强制将缓存区的内容输出
采用PHP实现”服务器推”技术的聊天室
        flush(); //强制将缓冲区的内容发送给客户端
采用PHP实现”服务器推”技术的聊天室
}
采用PHP实现”服务器推”技术的聊天室
print "Content-type: text/plain ";
采用PHP实现”服务器推”技术的聊天室
print "The end ";
采用PHP实现”服务器推”技术的聊天室
print "–endofdiv– ";
采用PHP实现”服务器推”技术的聊天室

  使用firefox打开,看看你看到了什么。

 

  这个例子,使用了ob_flush(), 这样可以在代码中控制缓存区内容的输出时机,更加灵活一些。

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号