传统的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<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标记的开头之前缓存内容,并且在接受到</table>标记之前,不会显示出整个表格。
一些版本的MicrosoftInternetExplorer只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
接下来,我贴一个很有趣的代码,有兴趣的同学,可以试试:
header(‘Content-type:multipart/x-mixed-replace;boundary=endofsection‘); print" –endofsection "; $pmt=array("-","/","|","/"); for($i=0;$i<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(), 这样可以在代码中控制缓存区内容的输出时机,更加灵活一些。
|
相关推荐
简易聊天室 v0.1 <br>本聊天室采用smarty+fleaphp+mysql设计而成. 1.安装 把本目录拷到你服务器所在的htdocs目录下,并修改index.php中的数据库配置. index.php?controller=chat 访问聊天室 我的个人...
龙口聊天室源码是一款模仿omegle的聊天系统,可以匿名随机聊天的程序 龙口聊天室源码功能: 1.匿名用户配对聊天 2.聊天记录可以下载 3.可以显示对方输入状态 4.采用轮询服务器方式传输数据,相比comet方式,服务器...
MySQL并发能力强、响应速度快,是性能优异的数据库软件;PHP是功能强大的服务器端脚本语言。笔者在山西铝厂网站开发中,采用PHP4.0+MySQL3.23.38...本文以一个简单的聊天室设计为例,介绍PHP+MySQL在网页开发中的应用。
龙口聊天室系统是龙口论坛开发的一款模仿omegle的聊天系统,可以实现匿名随机配对聊天等功能,新的版本除了修正部分bug,还启用了仿腾讯人海的模板,更加清新自然 龙口论坛聊天室源码功能: 1.匿名用户配对聊天 2....
PHP聊天室技术 黄国辉 1.前言 上网聊天是时下最流行的交友方式。各大网站推出的聊天室都各具特色。 聊天室主要分为WebChat、BBSChat两种。BBSChat是基于Telnet的Tcp协议,是BBS的附设功能,需要客户端Telnet程序。...
1.小巧,整个程序只有一...2.高效,使用ajax技术传输数据,服务器负担较小 3.保存聊天记录到php文件(不会被下载) 4.可以设置文字样式 5.显示在线用户 6.支持发送图片 7.完全支持IE6+ ,Firefox,Opera,Safari等主流浏览器
龙口聊天室系统是龙口论坛开发的一款模仿omegle的聊天系统,可以实现匿名随机配对聊天等功能,新的版本除了修正部分bug,还启用了仿腾讯人海的模板,更加清新自然 龙口论坛聊天室源码功能: 1.匿名用户配对聊天 ...
关于HTTP长连接的“服务器推”技术原理可以查看IBM的这篇文章,我简单的做了个DEMO.
如题,参见https://blog.csdn.net/thaiqi/article/details/113833229 或者http://www.zhishi-zhishi.net/working/server_chatroom.html
主要是基于Ajax架构的一个网络聊天室 数据库由mysql实现 服务器为apache 语言是php
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...
2.高效,使用ajax技术传输数据,服务器负担较小 3.保存聊天记录到php文件(不会被下载) 4.可以设置文字样式 5.显示在线用户 6.支持发送图片 7.完全支持IE6+ ,Firefox,Opera,Safari等主流浏览器 改进 --------...
首先是首页,包含一个文本输入和一个显示聊天内容的iframe,还有一个隐藏iframe用来提交form表单: 复制代码 代码如下: <?php //chat.php header(‘cache-control: private’); header(‘Content-Type: text/html...
workerman是一个高性能的PHP socket服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...
可以进行简单的网页聊天,实现了一个简单的使用服务器推技术的聊天室的框架。
7. 管理员可以踢人,锁定聊天室,禁止视频,语音。 8. 性能优秀:每个房间最高可达100人,一台服务器最高可支持10000人同时在线 , 普通ADSL可以同时看10路用户视频。 9. 轻松与原有应用系统集成, 支持ASP, ASP.NET,...
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...
通过websocket连接 服务器 1234端口。 index.php 37行 IP地址就是服务端IP地址 服务端 可用于ASP,PHP,.NET等各类程序 包含3个 JS 操作 // 登录服务区器 sendmsg('login','all',name...
毕设&课设&项目&实训-基于云服务器的TCP网络聊天室【客户端Qt5.6开发、后台服务器多进程实现、Mysql数据库管理用户信息】 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主...
实现聊天室,基本上就是通过Ajax来传递数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时聊天的功能。 消息显示区 消息显示区就是一个DIV块,我们会借助Ajax获取到服务器端信息...