基于javascript、ajax、memcache和PHP实现的简易在线聊天室


Posted in Javascript onFebruary 03, 2015

在线聊天室(online chatrooms)是一个共多人进行沟通交流的网络平台,随着越来越多的新技术的发明和成熟运用,在线聊天室也出现使用各种不同技术的, 这篇文章我想简单总结一下。

首先说一下前台技术,最新的当然是基于HTML5的websocket,它实现了浏览器与服务器全双工通信(full-duplex)。WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。但是由于Websocket是HTML5的API,很多浏览器都还得不到支持,所以这种方式现在应用不是特别多。第二种是ajax,它是采用一种轮询的方式,每隔一段时间,去服务器上下载数据,查看是否更新,它的优点是异步请求处理(也可以设置同步),不会阻塞用户其它操作,缺点是不间断的轮询不仅占用消耗带宽,也占用过多的终端和服务器资源,而且由于ajax轮询有时间间隔,所以获得的消息不是实时的,因为不是消息触发,ajax的效率几乎是最低的。第三种是基于服务器的推送技术(comet),说是推送,其实是伪推送,原理是在终端和服务器之间建立一条长连接,前台通过判定这条长连接的内容是否改变而获取内容,它的优点是占用资源较少,实时性好,确实是需要服务器特别的支持,而且长时间占用连接。现在越来越多的服务都采用了这种技术。

再来说下后台,聊天室属于高IO的应用,数据库方面可能是最大瓶颈,聊天的特点是短文本较多,类似于微博。而且它属于多用户系统,当用户达到一个数量级时,如果采用Mysql等关系型数据库的话,查询的压力应该是很大的。如果没有特殊的要求,个人认为,聊天记录不需要永久存储,这时候memcache,redis等基于内存的存储系统就能发挥作用了。下面是我开发的一个简单的基于ajax+php+memcache的在线聊天室。

在这个聊天室中,所有聊天记录都存放在memcache中,用cid存储聊天记录的最大id,用msgcid存放聊天记录,每插入一条记录,cid自增1。前台通过ajax获取获取json格式数据,由于memcache是基于内存的特性,整体系统运行速度是非常快的。下面是系统的源码,整个系统只有两个文件,合起来不到10KB。

基于javascript、ajax、memcache和PHP实现的简易在线聊天室

https://github.com/hitoy/online-chatroom

系统需求:
1,安装有memcache
2,php安装memcache扩展
3,支持Javascript和ajax的现代浏览器

Javascript 相关文章推荐
自动完成JS类(纯JS, Ajax模式)
Mar 12 Javascript
javascript 冒号 使用说明
Jun 06 Javascript
jquery实现居中弹出层代码
Aug 25 Javascript
js关于命名空间的函数实例
Feb 05 Javascript
javascript鼠标右键菜单自定义效果
Dec 08 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
JavaScript new对象的四个过程实例浅析
Jul 31 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
jQuery内部原理和实现方式浅析
Feb 03 #Javascript
jQuery中extend函数的实现原理详解
Feb 03 #Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 #Javascript
jQuery中的pushStack实现原理和应用实例
Feb 03 #Javascript
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
You might like
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python处理中文标点符号大集合
2018/05/14 Python
python实现学员管理系统
2019/02/26 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
python3实现简单飞机大战
2020/11/29 Python
公共事业管理本科生求职信
2013/10/07 职场文书
营业员岗位职责范本
2015/04/14 职场文书
无故旷工检讨书
2015/08/15 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
2016中秋节广告语
2016/01/28 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
MySQL的存储过程和相关函数
2022/04/26 MySQL
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python