我是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
这不是我的实际代码,我想出的东西很快就能看出这个方法是否有效。我正在寻找有关此事的任何建议,谢谢
编辑:我将使用此功能检查新消息和警报。数据库结构将为每个用户创建一个表,该表将仅填充新消息和警报,一旦查看它们将被移动,因此对数据库和表的查询将仅返回结果,如果有新数据要显示
答案 0 :(得分:0)
您希望从客户端轮询结果,而不是让Web服务器不断轮询服务器端的数据库(在循环中)。
使用jQuery $.get
和setInterval
进行基本轮询的示例如下:
// 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);
}
?>