采用PHP实现”服务器推”技术的聊天室
时间:2008-08-18
来源:互联网
・ 本文地址: http://www.laruence.com/2008/04/16/118.html
・ 转载请注明出处
传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换。
本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱动化设计 ),来实现一个服务器推的PHP聊天室简单构想。
PHPer,尤其是用过set_cookie, header的,一定见过这样的提示信息:"Warning: Cannot modifyheader 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,是不是就可以实现,每当服务器有输出,就立即发送给客户端呢?
做个如下试验:





"Now Index is :".
$i;


结果我们发现,还是要等到脚本全部执行完以后,才能一次看到所有的结果。。
为什么呢?
这是因为我们只是解决了缓存问题,但是还有一个缓冲问题,PHP会缓冲程序的输出。所以,这个时候,我们还需要调用,flush(), 来强制使得PHP将所有的程序输出发送给客户端。






"Now Index is :".
$i;



现在是不是看到了,不断有服务器的数据显示出来?
有几个概念之间的关系,我这里补充以下:
在代码中使用ob_start(), 就相当于在php.ini中使用output_buffering=on一样,使用服务器缓存。
在代码中使用ob_end_flush() 就相当于在php.ini中使用output_buffering = false一样,关闭服务器缓存。
基于前面的讨论,我们就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室: 页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form. 这样,在第一个frame的脚本中:





=
NULL;





as
$msg){

$msg;


=
null;









这样就实现了一个简单的使用服务器推技术的聊天室的框架。
当然,关于实时输出,还有一些其他的限制,比如在PHP5手册中讲到的:








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



" �Cendofsection ";

=
array("-",
"\",
"|",
"/" );

=
0; $i
<10;$i
++ )



"Content-type: text/plain ";

"Part $i ".$pmt[$i
%
4];

"�Cendofsection ";


flush(); //强制将缓冲区的内容发送给客户端


"Content-type: text/plain ";

"The end ";

"�Cendofsection�C ";

使用firefox打开,看看你看到了什么。
这个例子,使用了ob_flush(), 这样可以在代码中控制缓存区内容的输出时机,更加灵活一些。
[ 本帖最后由 laruence 于 2008-8-21 11:19 编辑 ]
作者: laruence 发布时间: 2008-08-18



作者: nianjin 发布时间: 2008-08-18
作者: leric 发布时间: 2008-08-21
作者: myBe 发布时间: 2008-08-21
引用:
原帖由 leric 于 2008-8-21 00:57 发表这样要一直保持着一个TCP连接啊,所谓推也就是浏览器等待服务器端更多的数据了,如果有一段时间没有信息的话,浏览器会超时放弃吧。
需要服务器配合。
作者: laruence 发布时间: 2008-08-21
引用:
原帖由 myBe 于 2008-8-21 01:34 发表思路新。但感觉限制多不如搞cs了。
作者: laruence 发布时间: 2008-08-21

没有看到效果,首先"\"要改为"\\"
如果将header拿走,就看到陆陆续续的输出
[ 本帖最后由 ylcz 于 2008-8-21 11:47 编辑 ]
作者: ylcz 发布时间: 2008-08-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28