长轮询(LongPoll)

在一次面试中,面对在线聊天室的消息实时性需求,对于不支持WebSocket的低版本浏览器,提出了使用长轮询(Long Polling)作为解决方案。长轮询避免了频繁发送无用请求,减轻服务器压力,实现了一定程度的消息实时同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前去某公司面试,需要解决一个在线聊天室的消息实时性问题,且需要兼容低版本浏览器。
高版本浏览器自然不成问题,那么低版本的浏览器如何处理。
最先想到的方案,自然是轮询发ajax请求。在一定的程度上,这个方案可以解决实时性的问题。
但是随之带来的问题是,不停的向服务器发请求带来的服务器的压力,且多数时间都是无用请求。
后实在没有方案,向面试官请教之,得出一个方案: 长轮询。
服务器与客服端需保持一条长时间的请求,将请求Hold住,只在有数据或者超时情况下返回消息给客户端。

JavaScript代码:

$(function(){   
    $("#btn").on("click",,function(event){      
         $.ajax({   
            type:"POST",      
            dataType:"json",      
            url:"url", //请求url
            success:function(data,textStatus){
                //得到数据,显示数据并继续查询      
                if(data.success=="1"){
                    console.log('get message');
                    $("#btn").trigger('click');   
                }      
                //未得到数据,继续查询
                if(data.success=="0"){
                    console.log('no message');
                    $("#btn").trigger('click');      
                }
            }
        });      
    });
});    

php代码如下:

set_time_limit(0);//无限请求超时时间
$maxInvalidCount = 30;//最大尝试次数
$i=0;
while (true){      
    $result = mysqli_query($link, $sql); 
    //获取到数据   
    if ($result) { 
        $arr = array('success'=>"1",'result'=>[]);      
        echo json_encode($arr);      
        exit();      
    }

    //尝试获取数据次数,超过最大次数之后,给客户端一个响应,如果客户端没有响应,则直接关闭
    if ($i == $maxInvalidCount) {
        $arr = array('success'=>"0",'result'=>[]);      
        echo json_encode($arr);      
        exit();      
    }
    //休眠一秒
    sleep(1);
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值