2017-09-13 67 views
7

我調用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更新,請看看。 –

回答

0

原來,使用https而不是http和AJAX'get'方法而不是'post'來防止這個錯誤。

5

什麼被認爲是一個錄用過程?

「輸入過程」是您一次運行多少個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 /內存泄漏。謝謝! –