php实现AJAX长轮询

HTTP是无状态、单向的协议,用户只能够通过客服端向服务器发送请求并由服务器处理发回一个响应。若要实现聊天室、WEBQQ、在线客服、邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)”。
传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。
反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。

这里是页面代码:

<div id="msg"></div>
<input id="btn" type="button" value="测试" />

<script src="js/jquery-1.9.1.min.js"></script>
<script>
/**
*这里使用AJAX请求data.php页面获得„success‟的值,请求的时间达到80秒。
*在这80秒中若没有从服务端返回„success‟则一直保持连接状态,
*直到有数据返回或„success‟的值为0才关闭连接。
*在关闭连接后在继续下一次的请求。
**/
$(function(){
    $("#btn").bind("click",{btn:$("#btn")},function(evdata){
        $.ajax({
            type:"POST",
            dataType:"json",
            url:"http://localhost/testSome/data.php",
            timeout:10000,         //ajax请求超时时间10秒
            data:{time:"10"},     //5秒后无论结果服务器都返回数据
            success:function(data,textStatus){
                //从服务器得到数据,显示数据并继续查询
                if(data.success=="1"){
                    $("#msg").append("<br>[有数据]"+data.date+"-"+data.text);
                    evdata.data.btn.click();
                }
                //未从服务器得到数据,继续查询
                if(data.success=="0"){
                    $("#msg").append("<br>[无数据]"+data.date);
                    evdata.data.btn.click();
                }
            },
            //Ajax请求超时,继续查询
            error:function(XMLHttpRequest,textStatus,errorThrown){
                if(textStatus=="timeout"){
                    $("#msg").append("<br>[超时]"+data.date);
                    evdata.data.btn.click();
                }
            }
        });
    });
});
</script>

这里是php代码:

<?php
// 接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)
if (empty ( $_POST ['time'] ))
    exit ();
// 无限请求超时时间
set_time_limit ( 0 ); 
$i = 0;
//在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。
while ( true )
{
    usleep ( 500000 ); // 0.5秒
    $i ++;
    // 若得到数据则马上返回数据给客服端,并结束本次请求
    $rand = rand ( 1, 999 );
    if ($rand <= 40)
    {
        $arr = array (
                'success' => "1",
                'date' => date ( "H:i:s", time () ),
                'text' => $rand 
        );
        echo json_encode ( $arr );
        exit ();
    }
    // 服务器($_POST['time']*0.5)秒后告诉客服端无数据
    if ($i == $_POST ['time'])
    {
        $arr = array (
                'success' => "0",
                'date' => date ( "H:i:s", time () ),
                'text' => $rand 
        );
        echo json_encode ( $arr );
        exit ();
    }
}

测试结果:
在图中可以看到无数据的请求时间达到了5S,在5S的请求中若获得数据则请求关闭。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值