基于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图片滚动效果时间可随意设定当鼠标移上去时停止
Jun 26 Javascript
js 操作符汇总
Nov 08 Javascript
JavaScript基础函数整理汇总
Jan 30 Javascript
jquery+easeing实现仿flash的载入动画
Mar 10 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
JS模拟键盘打字效果的方法
Aug 05 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
解决vue init webpack 下载依赖卡住不动的问题
Nov 09 Javascript
微信小程序实现拍照和相册选取图片
May 09 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php正则修正符用法实例详解
2016/12/29 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
PHP 实现重载
2021/03/09 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
vue实现商城购物车功能
2017/11/27 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
基于python绘制科赫雪花
2018/06/22 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
python爬虫请求头设置代码
2020/07/28 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
中国梦口号
2014/06/13 职场文书
团委工作总结2015
2015/04/02 职场文书
尼克胡哲观后感
2015/06/08 职场文书
水知道答案观后感
2015/06/08 职场文书
遗嘱格式范本
2015/08/07 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android