重复性检查触发器错误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 - 资源使用概述
当Entry Entry命中20/20时,我得到错误508.如何维护低服务器输入过程? (测试了4级不同的浏览器,运行它们,直到环100+在共享主机本地计算机上没有问题)
原来,使用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)等选项。
试着组合多个选项,以获得更好的性能!
我喜欢选项3和2.与选项2相关的是,您是否了解Facebook提醒检索或Facebook聊天工作原理?我认为这是真正的实时从电话和桌面通知在同一时间。 –
我不知道具体如何工作,但是聊天是实时的。但是,Facebook拥有大量资源来实现这一目标。尝试在低容量Web主机上重新创建聊天应用程序可能并不理想。 – neuromatter
更新为30秒并使用document.hasFocus。没有EP /内存泄漏。谢谢! –
如果你可以添加更多的代码,它将帮助我们弄清楚发生了什么。表面上,每三分钟四次触发脚本不应超出您的输入过程限制。 –
@Jeaf Gilbert,当发生这种情况时,请在浏览器中打开网络选项卡,并向我们显示此类失败请求的响应标头。然后我们将看到哪个程序返回这个错误。它可以是Web服务器,PHP或一些代理。 –
@ i-man更新,请看看。 –