2017-03-03 75 views
-1

我不是很精通AJAX请求,但我在头有这样简单的脚本:Ajax请求超时曹景伟

function refresh_div() { 
    jQuery.ajax({ 
     url:'progress.php?game=<?php echo $gamename; ?>', 
     type:'POST', 
     success:function(results) { 
      jQuery(".middle").html(results); 
     } 
    }); 
} 

    t = setInterval(refresh_div,1000); 

,然后在progress.php文件我有不少mysql的请求我db,其目的是每秒用这个php数据刷新页面。这在大多数情况下都可以正常工作,但是我发现但是,无论何时我将这个脚本同时重复调用几次,我都会收到超时错误并且页面不会加载。这是一个基于浏览器的游戏,其中包括一个每秒钟倒计时的计时器,所以重要的是我发现每秒钟都会稳定执行php请求。

新增progress.php:

<?php 



session_start(); 
$username = $_SESSION["username"]; 


$gamename = $_GET['game']; 



require "../connections/games.php"; 

$newgamesql = "SELECT * FROM gamelist WHERE name = '$gamename'"; 
$newgamequery = mysql_query($newgamesql, $gamesdbhandle); 

$newgamecount = mysql_num_rows($newgamequery); 

$gamenamenospaces = str_replace(' ','_', $gamename); 

$gamestatus = mysql_result($newgamequery, 0, 'status'); 

$numberofplayers = mysql_result($newgamequery, 0, 'numberofplayers'); 


$player1 = mysql_result($newgamequery, 0, 'player1'); 
$player2 = mysql_result($newgamequery, 0, 'player2'); 
$player3 = mysql_result($newgamequery, 0, 'player3'); 
$player4 = mysql_result($newgamequery, 0, 'player4'); 
$player5 = mysql_result($newgamequery, 0, 'player5'); 
$player6 = mysql_result($newgamequery, 0, 'player6'); 
$player7 = mysql_result($newgamequery, 0, 'player7'); 
$player8 = mysql_result($newgamequery, 0, 'player8'); 

$rounds = mysql_result($newgamequery, 0, 'rounds'); 

$currentround = mysql_result($newgamequery, 0, 'currentround'); 

$gametimestamp = mysql_result($newgamequery, 0, 'actualtime'); 

$headmaster = mysql_result($newgamequery, 0, 'headmaster'); 

$roundtime = mysql_result($newgamequery, 0, 'time'); 

$activeplayers = mysql_result($newgamequery, 0, 'activeplayers'); 

$numberofplayers = mysql_result($newgamequery, 0, 'numberofplayers'); 

$roundtimeproper = strtotime("H:i:s" , $roundtime); 

//Round time conversion goes here: 

//The specific table query for the individual rounds 


$thegamesql = "SELECT * FROM `$gamenamenospaces` WHERE id='$currentround' LIMIT 1"; 
$thegamequery = mysql_query($thegamesql, $gamesdbhandle); 


$echocurrentround = mysql_num_rows($thegamequery) + 1; 

$thisroundplayer1 = mysql_result($thegamequery, 0, "player1card"); 
$thisroundplayer2 = mysql_result($thegamequery, 0, "player2card"); 
$thisroundplayer3 = mysql_result($thegamequery, 0, "player3card"); 
$thisroundplayer4 = mysql_result($thegamequery, 0, "player4card"); 
$thisroundplayer5 = mysql_result($thegamequery, 0, "player5card"); 
$thisroundplayer6 = mysql_result($thegamequery, 0, "player6card"); 
$thisroundplayer7 = mysql_result($thegamequery, 0, "player7card"); 
$thisroundplayer8 = mysql_result($thegamequery, 0, "player8card"); 

$thisroundwhitecard = mysql_result($thegamequery, 0, "whitecard"); 
$thisroundwhitecard = str_replace("_", "_____", $thisroundwhitecard); 


$thisroundtime = mysql_result($thegamequery, 0, "timestamp"); 



$now = new DateTime(); 
$target = DateTime::createFromFormat('H:i:s', $gametimestamp); 
$difference = $now->diff($target); 

$difference = $difference->format("%I:%S"); 


//Display the timer 

echo '<div id="timer">'; 
echo 'TIME:'; 
echo '<br />'; 
echo $difference; 
echo '</div>'; 
//echo $timer; 



//State which round 

echo '<div id="toptitle">'; 
echo $gamename; 
echo ' - '; 
echo 'Round '; 
echo $currentround; 
echo '</div>'; 

if ($gamestatus == 'active') { 
//Game is live, display things 

echo '<div id="placeholderplaceholder">'; 


//The card submit bar 

if (!empty($player1)) { 

if (!empty($player1card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P1'; 


echo '</div>'; 

} 

if (!empty($player2)) { 

if (!empty($player2card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P2'; 


echo '</div>'; 

} 

if (!empty($player3)) { 

if (!empty($player3card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P3'; 


echo '</div>'; 

} 

if (!empty($player4)) { 

if (!empty($player4card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P4'; 


echo '</div>'; 

} 

if (!empty($player5)) { 

if (!empty($player5card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P5'; 


echo '</div>'; 

} 

if (!empty($player6)) { 

if (!empty($player6card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P6'; 


echo '</div>'; 

} 

if (!empty($player7)) { 

if (!empty($player7card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P7'; 


echo '</div>'; 

} 

if (!empty($player8)) { 

if (!empty($player8card)) { 

echo '<div class="blackcardplaceholderplaced">'; 

}else{ 

echo '<div class="blackcardplaceholder">'; 

} 

echo 'P8'; 


echo '</div>'; 

} 

echo '</div>'; 



if ($headmaster == $username) { 
//You are the headmaster, show the judge view 

echo '<br />Your turn to <div id="headmaster">Judge</div><br /><br />'; 

if(!empty($thisroundwhitecard)) { 
echo '<div class="bigwhitecard">'; 
echo $thisroundwhitecard; 
echo '</div>'; 
} 


}else{ 
//You are not the headmaster, show the player view 

//Randomly generate 5 cards 

require '../dbauth/cards.inc.php'; 
    $cardsdbhandle = mysql_connect(

    $cardshostname, 
    $cardsusername, 
    $cardspassword 

    ) or die("INVALID USERNAME OR PASSWORD"); 

    $cardsselected = mysql_select_db($cardsdbname, $cardsdbhandle); 

$newblackcardsql = "SELECT * FROM black LIMIT 5"; 
$newblackcardquery = mysql_query($newblackcardsql, $cardsdbhandle); 

$newblackcardcount = mysql_num_rows($newblackcardquery); 

$c = 0; 

if ($newblackcardcount > 0) { 

    echo '<div class="blackcardscroller">'; 
    echo '<div class="blackcardscrollerinner">'; 

while ($c < $newblackcardcount) { 

$blackcardid = mysql_result($newblackcardquery, $c, "id"); 
$blackcardtext = mysql_result($newblackcardquery, $c, "text"); 


echo '<div class="gameblackcard">'; 
echo $blackcardtext; 

echo '<div class="blackcardbtn" id="'; 
echo $blackcardid; 
echo '">PICK CARD</div>'; 
echo '</div>'; 

$c++; 

} 

echo '</div>'; 
echo '</div>'; 

}else{ 
//There are no black cards 

echo 'There are no black cards to pick from! Something went wrong...'; 

} 

echo '<br />Judge: <br />'; 
echo '<div id="headmaster">'; 
echo $headmaster; 
echo '</div>'; 





if(!empty($thisroundwhitecard)) { 
echo '<div class="bigwhitecard">'; 
echo $thisroundwhitecard; 
echo '</div>'; 
} 



} 

} 



?> 
+0

。显示的代码中没有任何内容会导致这种情况。尽管每秒钟提出请求*当然不是最好的主意。您可能需要查看Web套接字以将实时数据从服务器发送到客户端。 – David

+0

你能告诉我们服务器端代码吗? – Yolo

+0

你从'php'中得到任何错误吗?请将它们添加到您的问题。 – ventiseis

回答

1

你不应该使用的setInterval ...操作来代替:

function refresh_div() { 
    jQuery.ajax({ 
     url:'progress.php?game=<?php echo $gamename; ?>', 
     type:'POST', 
     success:function(results) { 
      jQuery(".middle").html(results); 
      setTimeout(function(){ 
       refresh_div(); 
      }, 1000); 
     } 
    }); 
} 

refresh_div(); 
+0

这也是我的建议。它可以防止超时错误,如果它们是由于服务器每秒都会发出请求而造成的。 – Popnoodles

+0

对此没有超时错误,但在一个实例中浏览器(chrome)产生“ERR_EMPTY_RESPONSE” – Dustin

+0

也许返回类型是错误的。尝试添加: dataType:'html' 右下键入:'POST' –

0

我觉得你在这串

t = setInterval(refresh_div,1000);

问题

您每秒都会从服务器获取查询,因此10秒后有10个问题因为服务器太忙而无法回答,所以这可能会导致超时,并且可能会因为多个并发查询而导致其他一些问题。所以我建议你尝试使用promise(),采取看在这个岗位:如果服务器端代码太长回应那么它听起来像问题是与服务器端代码

in JavaScript, how to wrap a promise in timeout?