错误:508(检测到循环)

时间:2016-11-03 16:44:47

标签: javascript php jquery html

嗯,这不是一个正确的问题或任何事情.. 我只是有点好奇,尝试搜索,但找不到我的问题的准确答案,所以我决定尝试并在这里提出另一个问题。

我有这个小小的有趣时间项目,你应该继续点击按钮,直到你获得其他玩家的最高点击次数,我有一个页面 ManageClick.php 下面的代码 -

<?
sleep(rand(1,3));
$storage = fopen("TOTAL.txt", "r+");
if (flock($storage, LOCK_EX)) {
    $a = fread($storage,filesize("TOTAL.txt"));
    $a++;
    fseek($storage, 0);
    fwrite($storage, $a);    
    flock($storage, LOCK_UN);
} else { 
}
fclose($storage);
?>

以上在1-3秒之间添加随机延迟,然后打开文件 TOTAL.txt 读取它,并为文件中的值添加+1。

我有一个主页Testpage.html,它有一个简单的按钮和一个JQuery函数,当单击该按钮时,它会调用页面 ManageClick.php 。但是,现在问题出现了。只要用户快速单击主页面中的按钮,它就会在控制台窗口中显示以下错误 -

 GET http://domain.tk/ManageClick.php 508 (Loop Detected) 
 GET http://domain.tk/TOTAL.txt 508 (Loop Detected) 

WHERE 域名是我网站的名称。

知道可能导致以下问题的原因是什么?快速单击按钮就是其中之一,我猜这些请求会向页面发送多个请求并导致508错误。此外,我可以尝试修复此错误以在控制台中显示的任何可能方式吗?

另外,请注意我不是英语...对不起。

请查看 - 添加我的Testpage.html代码,以获得更好的帮助。

 <html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
$("img").click(function() {
var test = $("#Clicks").load("TOTAL.txt");
$.post('ManageClick.php');
});
});
</script>
</head>
<body >
<center>
<img src='ABCD.png'>
<div id='Clicks' style=""></div>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

您的网络服务器正在检测基于某些配置的长时间运行的脚本。我打赌如果你取消睡眠功能,它将不再检测到循环。

另外,如果您希望TOTAL.txt中的值增加,请务必强制转换为整数。

$a = fread($storage,filesize("TOTAL.txt"));
$a = (integer) $a;  // cast as integer
$a++; // now you can increase it

要进一步缓解此问题,如果必须保留lseep()函数,请在html / js中使用以下步骤:

  1. click_button(call ajax)
  2. disable_button(当ajax正在运行/ php正在休眠时)
  3. accept_ajax_return_value(当ajax回应时)
  4. 重新启用按钮(ajax完成后可以再次启用)

答案 1 :(得分:1)

如果我理解,你有一个网页,其中有一个游戏,你可以在其中调用php脚本来保存用户点击按钮的次数。

你说控制台(我猜是Chrome的开发工具或类似工具)会返回508错误,因为&#34; Loop检测到&#34;。这是服务器告诉客户端代码中可能存在循环,因为它被调用了太多次。嗯......它不是一个自动重定向,只是你多次调用它。

根据您对游戏的解释,我宁愿保存javascript变量中的点击次数,也只能在游戏结束后发送。这样,您只需要调用一次服务器。

另一方面,您的PHP代码假定您的网站只有一个用户。我的意思是,您将价值保存在文件中,但它并没有考虑到谁的游戏。

如果你和我同时打开网站,你开始添加点击,然后我再添加一个,但计数会保存在同一个地方。

编辑:代码示例

jQuery的:

var test = $("#Clicks").load("TOTAL.txt");
$("img").click(function() {
  test = parseInt(test) + 1;
});

使用此功能,您可以加载先前存储的数字并保持点击次数。接下来,您需要构建一个函数,在一些空闲时间之后发送点击计数(或者如果您每轮都有超时)

我假设如果用户没有点击就花了3秒钟,他就不见了,所以我更新了服务器。新的jquery将是:

var test = $("#Clicks").load("TOTAL.txt");
var wdt;
$("img").click(function() {
  wdt = setTimeout(serversync, 3000);
  test = parseInt(test) + 1;
});

function serversync(){
  $.post('ManageClick.php?count='+test);
}

在此代码中,我添加了serversync函数。它运行在setTimeout()后3000毫秒。当用户点击时会触发此超时,但如果再次点击,则计时器会重置。

最后,您应该将新计数值传递给ManageClick.php脚本。我将它作为count GET属性传递给你(你可以通过$_GET['count']

在你的php中检索它

当然,这不是完美的,也不是安全的(我可以很容易地假装大量的数据被发送到服务器,但这是另一个故事),但它的想法是