在线实时聊天的实现方案讨论
时间:2010-05-12
来源:互联网
一般实现在线实时聊天,是利用JS在客户端使用ajax每隔一定的时间就返回服务器请求数据,如果有新的聊天信息则用JS呈现给用户
我们不说这样做的利弊,直接切入正题,如何来实现服务器推的在线聊天系统
首先,我先请大家看一个例子
复制代码
|
运行后看到什么?是不是每隔一秒就输出一次“这是一条信息”?
这个就可以让我们模拟实现服务器推了
这里先说明一点。例子里面的聊天系统是基于数据库的。当然了,也可以是基于文件系统的,但是基于文件的就比较麻烦了。我们选个简单的,说清楚道理就可以了。
文件的结构如下:
chat.php 主页文件
msgshow.php 聊天信息展示文件
send.php 聊天信息发送文件
conn.php 数据库接口文件
数据表如下
chat表:
msgid 聊天信息ID
msg 信息内容
sendtime 发送时间
senduser 发送人姓名
好,我们正式开始
chat.php文件中,有一个浮动框架连接到msgshow.php文件
chat.php文件代码如下
复制代码
|
msgshow.php文件代码如下
复制代码
|
简单起见,我们模拟一个用户点击发表按钮发言的动作,即:send.php完成的功能
代码如下
复制代码
|
好,现在先试试可不可以正确执行。用浏览器访问chat.php
另开一个页面,访问send.php。然后试着去刷新send.php,看chat.php中是否会显示出“测试信息”字样。如果显示出来,说明测试成功
在我电脑上进行的测试,是使用了firefox和ie模拟两个用户进入聊天室,并且在两个浏览器中同时访问send.php文件并,随机刷新,来模拟两个用户随机发言。测试通过
我不得不说,这么做的效率可以说是非常的低下,如果一个聊天室有200用户,那么这200个用户在同一时间内要查询200次数据库来获取自己需要的信息。而这个信息往往又是相同的。因此,我们可以设计一个缓存模块来将一个聊天室的信息进行缓存,当200个运行中的msgshow.php不再去读取数据库,而是直接读取缓存文件,如果文件存在直接读取并格式化输出即可。至于缓存如何更新,那可以采用定时更新的方法,每1秒钟更新一次。前面我们已经看到,msgshow.php文件每次读取数据前,间隔时间为1.1秒,这也保证了,同一秒内不会读取到相同的缓存文件(每秒钟缓存文件为不同文件)。而一旦我们有了缓存模块后,数据库其实可以废弃。直接写入缓存文件中就可以了。这个是聊天室,至于点对点的双人聊天,还是使用数据库吧,不然文件实在是。。。太多了。即使是聊天室中,也是要定时清理缓存文件的,这对加速文件的读取是有好处的,比如你可以规定每个小时清理一次。我个人觉得可能的话还是使用memcached比较好。这方面就不再多说了。
我认为,在实际的应用中还是使用客户端拉数据的方式比较妥当,毕竟这方面比较成熟
以上内容属于个人观点,因为知识有限,难免有错误之处,希望大家看到后,可以回复指出,供给大家一起研究讨论。
作者: huaihuajio 发布时间: 2010-05-12
狂支持你~~
作者: figo0505 发布时间: 2010-05-12
作者: huaihuajio 发布时间: 2010-05-12
作者: figo0505 发布时间: 2010-05-12
而用PHP做出来的网页聊天室,负载能力有限,因为对数据库的操作过于频繁了,我正考虑还是使用基于文件比较好,如果有空,再试试memcached。
嘿嘿~~
最近是没时间了,手头上还有个设计没做好。唉。。破玩意学校
作者: huaihuajio 发布时间: 2010-05-12


作者: energy162 发布时间: 2010-06-13

作者: ting1991s 发布时间: 2010-06-16
作者: borfee 发布时间: 2010-09-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28