重复性检查触发器错误508(循环检测)

问题描述:

我调用AJAX来检查数据库是否每3或10秒钟有一个新的通知,同时查询来自4个不同的浏览器。但是在循环100+后的某个时间点,服务器返回错误508(循环检测)。这只是简单的网站,所以我不认为我需要VPS服务器。重复性检查触发器错误508(循环检测)

我在SELECT中添加了时间戳作为查询区分符,放置了unset,flush,mysqli_free_result,pause,mysqli_kill,mysqli_close,但仍然出现错误。入场流程达到20/20。

脚本

var counter = 1; 
var notiftimer; 

$(document).ready(function() { 
    ajax_loadnotifs(); 
}); 

function ajax_loadnotifs() { 
    $.ajax({ 
     type: "post", 
     url: "service.php", 
     dataType: "json", 
     data: { action:'loadnotifs' }, 
     success: function(data, textStatus, jqXHR){ 
      $("div").append($("<p>").text(counter++ + ": succeeded")); 

      notiftimer = setTimeout(function() { 
       ajax_loadnotifs(); 
      }, 3000); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log(jqXHR.responseText); 
     } 
    }); 
} 

service.php

$link = mysqli_connect('localhost', 'root', 'root', 'testdb'); 
$notifs = array(); 

$query = "SELECT id, message FROM notifs LIMIT 20"; 
if (!$temp_notifs = mysqli_query($link, $query)) { 
    die(json_encode(array("errmsg" => "Selecting notifs."))); 
} 

while($notif = mysqli_fetch_assoc($temp_notifs)) { 
    $notifs[] = $notif; 
} 

mysqli_close($link);   
echo json_encode($notifs); 

的cPanel - 资源使用概述

cPanel - Resource Usage Overview

当Entry Entry命中20/20时,我得到错误508.如何维护低服务器输入过程? (测试了4级不同的浏览器,运行它们,直到环100+在共享主机本地计算机上没有问题)

+0

如果你可以添加更多的代码,它将帮助我们弄清楚发生了什么。表面上,每三分钟四次触发脚本不应超出您的输入过程限制。 –

+0

@Jeaf Gilbert,当发生这种情况时,请在浏览器中打开网络选项卡,并向我们显示此类失败请求的响应标头。然后我们将看到哪个程序返回这个错误。它可以是Web服务器,PHP或一些代理。 –

+0

@ i-man更新,请看看。 –

原来,使用https而不是http和AJAX'get'方法而不是'post'来防止这个错误。

什么被认为是一个录用过程?

“输入过程”是您一次运行多少个PHP脚本。

来源:https://billing.stablehost.com/knowledgebase/186/What-is-considered-an-Entry-Processes.html

所以潜在的问题,因为你已经找到了最终你是在同一时间运行太多进程。有几件事可以解决这个问题。

选项1

找到一个新的虚拟主机。这可能是最简单但也是最昂贵的,具体取决于您与当前主机之间的财务安排。找到一个没有此限制的人。

选项2

增加AJAX请求之间的时间。为什么你需要每3秒钟请求一次?这是非常非常短的时间。大概15秒钟?还是30秒?或者,甚至1分钟?您的用户可能不需要按照您的想法经常刷新数据。

选项3

只有在当前标签/窗口处于聚焦执行AJAX调用。如果用户甚至没有看到您的页面,就没有理由继续对通知进行轮询。

退房Document.hasFocus()https://developer.mozilla.org/en-US/docs/Web/API/Document/hasFocus

选项4

实现一个高速缓存层。如果您觉得您仍然需要非常经常地请求数据,那么请提高您检索数据的速度。实现缓存的方式取决于您,但在某些情况下,即使使用文件写入/读取也可以减少完成请求所需的时间和资源。

从数据库中获取通知后,只需将JSON保存到文本文件中,然后从那里传递后继的请求,直到数据库数据发生更改。看看这是否可以提高性能。

如果你想更加专注于缓存,你可以看看Memcached(https://en.wikipedia.org/wiki/Memcached)或Redis(https://en.wikipedia.org/wiki/Redis)等选项。

试着组合多个选项,以获得更好的性能!

+0

我喜欢选项3和2.与选项2相关的是,您是否了解Facebook提醒检索或Facebook聊天工作原理?我认为这是真正的实时从电话和桌面通知在同一时间。 –

+0

我不知道具体如何工作,但是聊天是实时的。但是,Facebook拥有大量资源来实现这一目标。尝试在低容量Web主机上重新创建聊天应用程序可能并不理想。 – neuromatter

+0

更新为30秒并使用document.hasFocus。没有EP /内存泄漏。谢谢! –