跨浏览器推送数据(同一会话)

时间:2011-11-27 10:33:19

标签: php ajax

我看过像facebook这样的网页,如果你在新闻源中发布消息,它会自动将其推送到你的浏览器中。或者喜欢在这个页面上...如果有人在你打字时回答了一个问题,那么一个栏就会下降。

他们是否每30秒或者其他什么时候调用AJAX请求?这似乎是您服务器上的资源消耗。有没有办法在浏览器上推送一些内容?

3 个答案:

答案 0 :(得分:3)

这里有3个选项:

  • 使用新的(实验性)浏览器API(套接字)
  • 长轮询/彗星
  • 使用/收听cookie

PHP / AJAX中的长轮询/彗星示例

// PHP SIDE

$max_wait_time = 30; // at most, 30 seconds
$start_time = microtime(true);

while( $start_time - microtime(true) < $max_wait_time ){
    // ...check if something changed (eg, run an SQL query or something)
    if($something_changed){
        echo 'something changed';
        die;
    }
    // if the user did abort, terminate immediately
    if( connection_aborted() ) die;
    // sleep for one second. For faster responses, keep
    // splitting this suitably (eg, 0.5 of a second...)
    usleep(1000000);
}


// JS SIDE

var poll = function(){
    jQuery.get('the url', function(){
        poll();
    });
}

poll();

PHP / JS中的Cookie示例(您需要jQuery cookie插件)

<?php

    // PHP SIDE
    setcookie('test', mt_rand(0,100));

?><!-- HTML/JS SIDE -->

<a href="javascript:locaion.reload()">Rand!</a>

Rand=<span><?php echo $_COOKIE['test']; ?></span>

<script type="text/javascript">

    var oldrand = <?php echo $_COOKIE['test']; ?>;
    setInterval(function(){
        var newrand = jQuery.cookie('test');
        if( newrand!=oldrand ){
            jQuery('span').html(newrand);
            oldrand = newrand;
        }
    }, 500);

</script>

由于以下几个原因,cookie之一非常好:

  • 它非常快(没有AJAX调用)
  • 客户端和服务器端的资源密集程度较低
  • 消耗较少的带宽/网络资源
  • 更容易控制

在某些情况下,cookie无法运行,我仍然主张使用cookie作为运行AJAX调用的信号,因此您不需要运行大量的AJAX调用来等待更改发生

另一方面,当第三方发生更改时,cookie将不起作用,例如,它根本不适用于聊天系统。

答案 1 :(得分:2)

了解更多信息,请阅读推送 pull 之间的差异:

在您的示例中,每隔30秒的AJAX请求将是 pull 请求 - 不断询问服务器是否有可用的更新,然后是响应。 您可以设置服务器/网站以将推送通知发送到客户端浏览器 - 客户端静静地坐着,服务器一旦可用就将数据/信息发送到客户端(减少网络)交通等。)。

在我看来,推动力要好得多。

答案 2 :(得分:0)

是的,您必须使用循环Ajax脚本进行轮询。为了减少资源耗尽,您可能希望发送某种哈希值(例如最后一个新闻项的时间戳),以便服务器知道客户端是否是最新的。这样,如果没有推动变化,它可以立即返回。