使用ajax获取服务器更新

时间:2014-01-17 00:36:34

标签: php jquery ajax

我是ajax的新手,并要求从服务器不断更新,我已经阅读了有关实现这一目标的不同方法的文章,但我想确保我掌握了究竟发生了什么以及需要做什么完成,如果我的方法可行。

我的ajax代码如下:

function updates() {
     var xmlhttp;

                if (window.XMLHttpRequest) {
                    // code for IE7+, Firefox, Chrome, Opera, Safari
                    xmlhttp=new XMLHttpRequest();
                }
                else {
                    // code for IE6, IE5
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }

                xmlhttp.onreadystatechange=function(){
                    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                        //do stuff with data
                        //recall function to check for more updates
                        updates();
                    }
                }           

                xmlhttp.open("POST","./includes/updates.php",true);
                xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

                xmlhttp.send();    



}

然后是php代码:

<?php


require './db_connect.php';
$result = mysqli_query($con, "--CHECK FOR NEW UPDATES--");
$numrows = 0;

while ($numrows == 0) {
   $result = mysqli_query($con, "--CHECK FOR NEW UPDATES--"); 
   $numrows = mysqli_num_rows($result);
   //add delay to lessen load?
   usleep(1000);
}

//convert to JSON and return data

echo $data

这不是我的实际代码,我想出的东西很快就能看出这个方法是否有效。我正在寻找有关此事的任何建议,谢谢

编辑:我将使用此功能检查新消息和警报。数据库结构将为每个用户创建一个表,该表将仅填充新消息和警报,一旦查看它们将被移动,因此对数据库和表的查询将仅返回结果,如果有新数据要显示

2 个答案:

答案 0 :(得分:0)

您希望从客户端轮询结果,而不是让Web服务器不断轮询服务器端的数据库(在循环中)。

使用jQuery $.getsetInterval进行基本轮询的示例如下:

// Begin polling server every 8 seconds
var timerId = setInterval(function() {
    $.get('/server/results', function(data) {
        // Oh look some valid data! Stop the polling
        clearInterval(timerId);
        // TODO: Handle the results however you like
    });
}, 8000);

现在您的服务器需要简单地查询数据库,并输出结果集。

答案 1 :(得分:0)

你可以这样做。在页面加载时调用poll函数。然后它会发送一个ajax请求。如果您的服务器在30秒内响应它将处理成功函数,否则它将超时并再次启动poll它将继续运行。我更喜欢这种方法,类似于Facebook。这给出了实时更新的外观。如果检查元素,则可以看到长轮询。它也减少了对服务器的请求数量。

function poll(){
       $.ajax({
            type: "POST",
            cache: false,
            timeout: 30000,
            url: "/./includes/updates.php"
            }).then(function(response, textStatus) {
                 if(response){
                  //tell the user they have a new message

                  //start the poll again
                  poll();
                 }
            }).always(function(response, errorThrown){
                if(errorThrown == "timeout"){
                    //timedout start the poll again
                    poll();
                }
        });
}

我也会在服务器端设置超时。

在php中像

<?php
$now = time();
$timeout = 30;

while((time() - $now) < $timeout) {
    //check for new messages with sql query
    if($messages){
     //echo whatever
    break;
   }
   usleep(1000);
}
?>