【问题标题】:ERROR: 508 (Loop detected)错误:508(检测到循环)
【发布时间】:2017-11-21 06:58:34
【问题描述】:

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

我有一个有趣的小项目,您应该在其中继续单击一个按钮,直到您在其他玩家中获得最高的点击次数,我有一个页面 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>

【问题讨论】:

  • 请出示Ajax代码。
  • 根据您共享的代码,GET http://domain.tk/TOTAL.txt 不应该出现在控制台窗口中。这里发生了其他事情。
  • 这也可能是糟糕的 ModRewrite 规则。
  • 这个项目开始的TOTAL.txt文件里有什么?
  • @webjuju 目前TOTAL.txt的值为1。

标签: javascript php jquery html


【解决方案1】:

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

您说控制台(我猜是 chrome 的开发工具或类似工具)返回 508 错误作为“检测到循环”。这是服务器告诉客户端代码中可能存在循环,因为它被调用太多次。嗯...这不是自动重定向,只是您多次调用它。

根据您对游戏的解释,我宁愿将点击次数保存在 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 中检索它

当然,这既不完美也不安全(我可以很容易地伪造大量计数以发送到服务器,但这是另一回事),但这就是想法

【讨论】:

  • 这就像我可以做到的那样..每个人完成的总点击量应该存储在一个单独的文件中,每次用户点击按钮时都需要显示其值..基本上它只是像一个视图计数器(除了用户需要点击一个按钮在文件中添加+1)
  • 如果用户喜欢,他可以创建自己的帐户,该特定用户所做的点击将存储在表格中,并以“排行榜”的形式对所有人可见(实际上.. 40% 的网站是印地语)
  • @AkshitSharma 检查我编辑的回复。我添加了一些代码示例
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢您的帮助。不幸的是,这似乎对我不起作用。请重新检查我的问题(添加了我的 Testpage.html 的代码),这可能有助于进一步尝试解决问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多