php+ajax实现长轮询(Comet)

Eddy 发布于2013-11-8 16:40:4 分类: 技术心得 已浏览loading 网友评论1条 我要评论

所谓ajax长轮询,简单说就是客户端发起ajax请求,服务端会挂起该请求(通过循环),直到条件触发使服务器返回,在服务器返回前客户端一直处于pending,等待服务器返回。

ajax长轮询可以减少客户端的无用请求,不过服务端的压力会大一些。另外可以采用websocket实现推送,不过兼容性会差些,有些浏览器不支持websocket。

下面的代码可实现Comet:

服务端代码:


<?php
//server.php 服务端 
set_time_limit(0);
$filename = './data.txt';

//模拟新消息到来
if (!empty($_GET['m'])) {
	file_put_contents($filename, $_GET['m']);
	exit(0);
}

$old = filemtime($filename);
$cur = filemtime($filename);

while ( $cur <= $old) {
	usleep(500000);//休息500ms
	clearstatcache();
	$cur = filemtime($filename);
}

echo file_get_contents($filename)
 ?>

客户端代码:


<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<script src="../jquery/jquery-1.9.0.min.js"></script>
	<title>ajax</title>
</head>
<body>
	<button id="click1">click1</button>
	<script>
	var sending=false;
	$(function(){
		$("#click1").click(function(){
			$.ajax({
				type:"POST",
				url:"server.php",
				timeout:0,
				beforeSend:function(){
					if (sending) {
						return false;
					}
					sending = true;
				},
				data:"username=eddy&password=123456",
				success:function(data){
					alert(data);
				},
				error:function(data){
					;
				},
				complete:function(){
					sending=false;
					$("#click1").click();
				}
			});
		});
	});
	</script>
</body>
</html>

点击click1按钮,发起请求,等待服务端返回(新消息到来)。此时可通过访问 /server.php?m=1234568798798000 模拟消息到达,消息到达服务端返回数据,客户端弹出消息内容。

已经有(1)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/technique/891.html     欢迎订阅Eddy Blog

  1. 发表于2013-11-10 8:41:58

    现在web聊天软件都是基于ajax来做这样耗资源。等待浏览器全线支持socket

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言