我看过像facebook这样的网页,如果你在新闻源中发布消息,它会自动将其推送到你的浏览器中。或者喜欢在这个页面上...如果有人在你打字时回答了一个问题,那么一个栏就会下降。
他们是否每30秒或者其他什么时候调用AJAX请求?这似乎是您服务器上的资源消耗。有没有办法在浏览器上推送一些内容?
答案 0 :(得分:3)
这里有3个选项:
// 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
// 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之一非常好:
在某些情况下,cookie无法运行,我仍然主张使用cookie作为运行AJAX调用的信号,因此您不需要运行大量的AJAX调用来等待更改发生
另一方面,当第三方发生更改时,cookie将不起作用,例如,它根本不适用于聊天系统。
答案 1 :(得分:2)
了解更多信息,请阅读推送和 pull 之间的差异:
在您的示例中,每隔30秒的AJAX请求将是 pull 请求 - 不断询问服务器是否有可用的更新,然后是响应。 您可以设置服务器/网站以将推送通知发送到客户端浏览器 - 客户端静静地坐着,服务器一旦可用就将数据/信息发送到客户端(减少网络)交通等。)。
在我看来,推动力要好得多。
答案 2 :(得分:0)
是的,您必须使用循环Ajax脚本进行轮询。为了减少资源耗尽,您可能希望发送某种哈希值(例如最后一个新闻项的时间戳),以便服务器知道客户端是否是最新的。这样,如果没有推动变化,它可以立即返回。