php 基于memcache Ajax长链接 ,实现web聊天室
2017-5-23 guoweidong php开发
Web 通信 之 长连接、长轮询(long polling)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。
一、什么是长连接、长轮询?
用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。
二、优缺点
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天
Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。
事例:web即时聊天室
首先准备3个文件:test.htm、get.php、set.php
html代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
<meta charset="utf-8">
<center>
<div id="show" style="width: 270px;height: 300px;margin-right: 55px ;border: 1px solid;overflow: auto "></div>
<textarea cols="30px" rows="10px"></textarea>
<button>发送</button>
</center>
</body>
<script type="text/javascript" charset="utf-8" src="./jquery-2.0.3.min.js"> </script>
<script>
function get(obj) {
if(obj==undefined){
obj = '';
}
$.post('get.php',{'call':obj}, function (data) {
if(data){//将返回的数据放入div中展示
$('div').html(data.join('<br />'));
}
get();
}, 'json')
}
$(function(){
$("button").click(function(){//将聊天信息请求php接口放入memcache中
$.post('set.php',{'content':$("textarea").val()})
})//第一次访问
get('one');
})
</script>
get.php:
<?php
//实例化memcache
$memcache = new Memcache;
$memcache->addServer('localhost','11211');
//取memcache内容
$data=$memcache->get('chat_data');
if($_POST['call']=='one'){//第一次访问显示之前数据
exit(json_encode($data));
}
$c=count($data);
while(true){
//如果有数据循环读出,没有的话终止循环
$count=$memcache->get('chat_data');
if(count($count)>$c){
//json数据返回
exit(json_encode($data));
}
}
?>
set.php
<?php
//实例化memcache
$memcache = new Memcache;
$memcache->addServer('localhost','11211');
//清除缓存
//$memcache->flush();die;
$data = $memcache->get('chat_data');
//将缓存数据存入数组
$data[] =$_POST['content'];
$memcache->set('chat_data',$data,MEMCACHE_COMPRESSED,0);
//var_dump($memcache->get('chat_data')) ;
$memcache->close();
?>ok!web聊天室 就完成了!