2017-09-13 93 views
7

Zadzwonię do AJAX, aby sprawdzić DB, jeśli pojawia się nowy komunikat co 3 lub 10 sekund z tym samym zapytaniem z 4 różnych przeglądarek w tym samym czasie. Ale w pewnym momencie po pętli 100+ serwer zwraca Błąd 508 (Wykryto pętlę). To jest po prostu prosta strona, więc nie potrzebuję serwera VPS.Powtarzające się sprawdzanie wyzwalaczy Błąd 508 (wykrywanie pętli)

Dodałem znacznik czasu w SELECT jako narzędzie różnicujące zapytania, wstawię unset, flush, mysqli_free_result, pause, mysqli_kill, mysqli_close, ale błąd nadal występuje. Procesy wejścia uderzyły 20/20.

Script

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 - Przegląd wykorzystania zasobów

cPanel - Resource Usage Overview

Gdy procesy wejścia trafiają 20/20, pojawia się błąd 508. Jak zachować niskie procesy wprowadzania serwera? (Testowane z 4 różnych przeglądarek, uruchomić je wszystkie aż do pętli 100+ na shared hostingu. Bez problemu na komputerze lokalnym)

+0

Jeśli możesz dodać więcej kodu, pomoże nam to zorientować się, co się dzieje. Na powierzchni trafienie skryptu cztery razy co trzy minuty nie powinno maksymalnie przekroczyć limitu procesu wprowadzania. –

+0

@Jeaf Gilbert, proszę otworzyć zakładkę sieci w przeglądarce, gdy tak się stanie i pokazać nam nagłówki odpowiedzi dla takich nieudanych żądań. Wtedy zobaczymy, który dokładnie program zwraca ten błąd. Może to być serwer WWW, php lub inne proxy. –

+0

@ i-man zaktualizowany, proszę spojrzeć. –

Odpowiedz

0

Okazuje się, że używanie protokołu https zamiast http i AJAX metoda "get" zamiast "post" zapobiegają temu błędowi.

5

Co jest uważane za procesy wpis?

"Proces rejestracji" to liczba skryptów PHP uruchomionych jednocześnie.

Źródło: https://billing.stablehost.com/knowledgebase/186/What-is-considered-an-Entry-Processes.html

Tak więc podstawowy problem jak już dowiedziałem się w końcu używasz zbyt wielu procesów jednocześnie. Jest kilka rzeczy, które możesz zrobić, aby rozwiązać problem.

Wariant 1

Znajdź nowe hostingowego. Jest to prawdopodobnie najprostszy, ale i najbardziej kosztowny sposób, w zależności od tego, jaki masz finansowy stosunek do obecnego gospodarza. Znajdź taki, który nie ma tego ograniczenia.

Wariant 2

Zwiększyć czas pomiędzy ajax żądań. Dlaczego musisz pytać co 3 sekundy? To bardzo, bardzo krótki czas. Co około 15 sekund? Lub 30 sekund? Lub do cholery, nawet 1 minutę? Twoi użytkownicy prawdopodobnie nie potrzebują odświeżanych danych tak często, jak Ci się wydaje.

Wariant 3

przeprowadzić tylko wywołania AJAX, jeśli bieżąca zakładka/okno jest w centrum uwagi. Nie ma powodu, aby nadal pobierać odpowiedzi na powiadomienia, jeśli użytkownik nawet nie patrzy na twoją stronę.

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

Wariant 4

Wdrożenie warstwę buforowania. Jeśli nadal chcesz bardzo często żądać danych, popraw to, jak szybko odzyskasz te dane. Sposób implementacji buforowania zależy od Ciebie, ale w niektórych przypadkach nawet użycie pliku write/read może zmniejszyć ilość czasu i zasobów potrzebnych do realizacji żądania.

Po otrzymaniu powiadomień z bazy danych po prostu zapisz JSON w pliku tekstowym i dostarczaj kolejne zapytania, dopóki dane w bazie danych się nie zmienią. Sprawdź, czy to poprawia wydajność.

Jeśli chcesz jeszcze bardziej skoncentrować się na buforowaniu, możesz przejrzeć opcje takie jak Memcached (https://en.wikipedia.org/wiki/Memcached) lub Redis (https://en.wikipedia.org/wiki/Redis).

Spróbuj połączyć wiele opcji, aby uzyskać jeszcze lepszą wydajność!

+0

Podoba mi się opcja 3 i 2. Czy w związku z opcją 2 masz pomysł na to, jak działa funkcja Facebook Notif lub Facebook? Myślę, że to naprawdę w czasie rzeczywistym, zarówno z telefonu i komputera powiadomić w tym samym czasie. –

+0

Nie wiem dokładnie, jak działa, ale tak, czat będzie w czasie rzeczywistym. Jednak Facebook ma wiele zasobów, aby to umożliwić. Próba odtworzenia aplikacji do czatu na małym serwerze WWW prawdopodobnie nie jest idealna. – neuromatter

+0

Zaktualizowano do 30 sekund i za pomocą document.hasFocus. Brak wycieku EP/pamięci. Dziękuję Ci! –