`
阿尔萨斯
  • 浏览: 4171286 次
社区版块
存档分类
最新评论

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

 
阅读更多

传统的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.ini中output_buffering=0或者使用ob_end_flush()关闭缓存

set_time_limit(0);
for($i=0;$i<10;$i++){
echo"NowIndexis:".$i;
sleep(1);
}

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

为什么呢?

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

//设置php.ini中output_buffering=0
ob_end_flush();//关闭缓存

set_time_limit(0);
for($i=0;$i&lt;10;$i++){
echo"NowIndexis:".$i;
flush();
sleep(1);
}

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

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

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

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

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


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_mesgas$msg){
echo$msg;
}
$new_mesg=null;
}
}
}

functiongetNewMesg(){
//通过查询数据库,或者共享内存,来获取现在的聊天室大厅的内容。
//返回一个数组,包含所有的新的聊天内容

}

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

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

个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

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

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

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


header(Content-type:multipart/x-mixed-replace;boundary=endofsection);
print" –endofsection ";
$pmt=array("-","/","|","/");
for($i=0;$i&lt;10;$i++)
{
sleep(1);
print"Content-type:text/plain ";
print"Part$i ".$pmt[$i%4];
print"–endofsection ";
ob_flush();//强制将缓存区的内容输出
flush();//强制将缓冲区的内容发送给客户端
}
print"Content-type:text/plain ";
print"Theend ";
print"–endofsection– ";

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

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

分享到:
评论

相关推荐

    php 简易聊天室

    简易聊天室 v0.1 &lt;br&gt;本聊天室采用smarty+fleaphp+mysql设计而成. 1.安装 把本目录拷到你服务器所在的htdocs目录下,并修改index.php中的数据库配置. index.php?controller=chat 访问聊天室 我的个人...

    php龙口聊天室开源源码v1.1

    龙口聊天室源码是一款模仿omegle的聊天系统,可以匿名随机聊天的程序 龙口聊天室源码功能: 1.匿名用户配对聊天 2.聊天记录可以下载 3.可以显示对方输入状态 4.采用轮询服务器方式传输数据,相比comet方式,服务器...

    用PHP+MySQL搭建聊天室

    MySQL并发能力强、响应速度快,是性能优异的数据库软件;PHP是功能强大的服务器端脚本语言。笔者在山西铝厂网站开发中,采用PHP4.0+MySQL3.23.38...本文以一个简单的聊天室设计为例,介绍PHP+MySQL在网页开发中的应用。

    龙口聊天室源码 v1.1.rar

    龙口聊天室系统是龙口论坛开发的一款模仿omegle的聊天系统,可以实现匿名随机配对聊天等功能,新的版本除了修正部分bug,还启用了仿腾讯人海的模板,更加清新自然 龙口论坛聊天室源码功能: 1.匿名用户配对聊天 2....

    PHP聊天室技术

    PHP聊天室技术 黄国辉 1.前言 上网聊天是时下最流行的交友方式。各大网站推出的聊天室都各具特色。 聊天室主要分为WebChat、BBSChat两种。BBSChat是基于Telnet的Tcp协议,是BBS的附设功能,需要客户端Telnet程序。...

    PHP ajax聊天室 无刷先聊天室

    1.小巧,整个程序只有一...2.高效,使用ajax技术传输数据,服务器负担较小 3.保存聊天记录到php文件(不会被下载) 4.可以设置文字样式 5.显示在线用户 6.支持发送图片 7.完全支持IE6+ ,Firefox,Opera,Safari等主流浏览器

    龙口聊天室 1.1.rar

    龙口聊天室系统是龙口论坛开发的一款模仿omegle的聊天系统,可以实现匿名随机配对聊天等功能,新的版本除了修正部分bug,还启用了仿腾讯人海的模板,更加清新自然 龙口论坛聊天室源码功能: 1.匿名用户配对聊天 ...

    基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室

    关于HTTP长连接的“服务器推”技术原理可以查看IBM的这篇文章,我简单的做了个DEMO.

    websocket聊天室服务器和php前端(初步实现)

    如题,参见https://blog.csdn.net/thaiqi/article/details/113833229 或者http://www.zhishi-zhishi.net/working/server_chatroom.html

    Ajax聊天室 php

    主要是基于Ajax架构的一个网络聊天室 数据库由mysql实现 服务器为apache 语言是php

    workerman PHP socket 服务器框架

    workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...

    迷你聊天室程序ajax chatroom

    2.高效,使用ajax技术传输数据,服务器负担较小 3.保存聊天记录到php文件(不会被下载) 4.可以设置文字样式 5.显示在线用户 6.支持发送图片 7.完全支持IE6+ ,Firefox,Opera,Safari等主流浏览器 改进 --------...

    基于HTTP长连接的服务器推技术的php 简易聊天室

    首先是首页,包含一个文本输入和一个显示聊天内容的iframe,还有一个隐藏iframe用来提交form表单: 复制代码 代码如下: &lt;?php //chat.php header(‘cache-control: private’); header(‘Content-Type: text/html...

    一个PHP开发的的高性能Socket服务器框架.rar

     workerman是一个高性能的PHP socket服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...

    php_chat.rar_网页 聊天_网页 聊天 php

    可以进行简单的网页聊天,实现了一个简单的使用服务器推技术的聊天室的框架。

    网页视频聊天室软件zlchat v1.3  源码

    7. 管理员可以踢人,锁定聊天室,禁止视频,语音。 8. 性能优秀:每个房间最高可达100人,一台服务器最高可支持10000人同时在线 , 普通ADSL可以同时看10路用户视频。 9. 轻松与原有应用系统集成, 支持ASP, ASP.NET,...

    workerman-chat-for-winPHP socket 服务器框架

    workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...

    WebSocket简单聊天室.zip

    通过websocket连接 服务器 1234端口。 index.php 37行 IP地址就是服务端IP地址 服务端 可用于ASP,PHP,.NET等各类程序 包含3个 JS 操作 // 登录服务区器 sendmsg('login','all',name...

    毕设&课设&项目&实训-基于云服务器的TCP网络聊天室.zip

    毕设&课设&项目&实训-基于云服务器的TCP网络聊天室【客户端Qt5.6开发、后台服务器多进程实现、Mysql数据库管理用户信息】 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主...

    Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室

    实现聊天室,基本上就是通过Ajax来传递数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时聊天的功能。 消息显示区 消息显示区就是一个DIV块,我们会借助Ajax获取到服务器端信息...

Global site tag (gtag.js) - Google Analytics