php+ajax实现长轮询(Comet)

所谓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 模拟消息到达,消息到达服务端返回数据,客户端弹出消息内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值