【问题标题】:Repetitive Notif Checking triggers Error 508 (Loop Detected)重复通知检查触发错误 508(检测到循环)
【发布时间】:2018-02-21 17:52:40
【问题描述】:

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

我在 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 Processes 达到 20/20 时,我收到错误 508。如何维护低服务器 Entry Processes? (用 4 种不同的浏览器测试,在共享主机上运行它们直到循环 100+。在本地计算机上没有问题

【问题讨论】:

  • 如果您可以添加更多代码,它将帮助我们弄清楚发生了什么。从表面上看,每三分钟点击脚本四次应该不会超出您的输入过程限制。
  • @Jeaf Gilbert,发生这种情况时请在浏览器中打开网络选项卡,并向我们显示此类失败请求的响应标头。然后我们将看到究竟是哪个程序返回了这个错误。它可以是 Web 服务器、php 或一些代理。
  • @i-man 更新了,请看一下。
  • notifs 表有多少条记录?
  • 服务器上还有其他东西吗,例如 wordpress 实例?你有 ssh 访问服务器的权限吗?

标签: php ajax hosting shared-hosting


【解决方案1】:

什么是进入流程?

“进入过程”是您一次运行的 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 拥有大量资源来实现这一目标。尝试在低容量网络主机上重新创建聊天应用程序可能并不理想。
  • 更新到 30 秒并使用 document.hasFocus。没有 EP/内存泄漏。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2021-09-01
    相关资源
    最近更新 更多