2017-09-13 117 views
7

Aynı anda 4 farklı tarayıcıdan aynı sorguda 3 veya 10 saniyede bir yeni notif varsa DB'yi kontrol etmek için bir AJAX çağırıyorum. Ancak, 100+ döngüsünden sonra bir noktada sunucu 508 Hatası (Loop Detected) döndürür. Bu sadece basit bir site, bu yüzden VPS sunucusuna ihtiyacım olduğunu düşünmüyorum.Tekrarlayan Notif Tetikleyicileri kontrol etme Hata 508 (Döngü Algılandı)

SELECT içinde sorgu farklılaştırıcı olarak zaman damgası ekledim, unset, floş, mysqli_free_result, duraklat, mysqli_kill, mysqli_close koydu, ancak hata yine de oluşuyor. Giriş işlemleri 20/20.

Senaryo

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 - Kaynak Kullanımı Genel Bakış

cPanel - Resource Usage Overview

Giriş İşlemleri 20/20 vurduğunda, Hata 508'i alır. Düşük sunucu Giriş Süreçleri nasıl korunur? (Yerel bilgisayarda üzerinde. Hiçbir sorunu barındırma paylaşılan üzerinde döngü 100+ kadar hepsini çalıştırmak, 4 farklı tarayıcılarla test edilmiştir)

Girdi İşlemler kabul edilir Ne
+0

Kodunuzun daha fazlasını ekleyebilirseniz, neler olduğunu anlamaya yardımcı olur. Yüzeyde, komut dosyasını üç dakikada dört kez vurmak, giriş süreci sınırınızı aşmamalıdır. –

+0

@Jeaf Gilbert, lütfen bu durumda tarayıcıda ağ sekmesini açın ve bize bu başarısız istek için Yanıt üstbilgileri gösterin. Sonra tam olarak hangi programın bu hatayı döndürdüğünü göreceğiz. Web sunucusu, php veya bir proxy olabilir. –

+0

@ i-man güncellendi, lütfen bir göz atın. –

cevap

0

yerine http ve AJAX'ın 'get' yerine yöntem https kullanarak 'sonrası' Bu hatayı önlemek çıkıyor.

5

?

Bir "Giriş Süreci", bir seferde kaç PHP betiğinin çalıştığını gösterir.

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

Yani sonuçta aynı anda pek çok süreç çalışan bir dışarı buldum olarak altta yatan sorun. Sorunu çözmek için yapabileceğiniz birkaç şey var.

Seçenek 1

yeni bir web barındırma bulun. Bu, mevcut sunucunuzda sahip olduğunuz finansal düzenlemeye bağlı olarak belki de en basit ama aynı zamanda en maliyetli olanıdır. Bu kısıtlamaya sahip olmayan birini bulun.

Seçenek 2

ajax istekleri arasında süreyi artırın. Neden her 3 saniyede bir talepte bulunmalısınız? Bu çok kısa bir süre. 15 saniye kaç? Ya da 30 saniye mi? Ya da heck, hatta 1 dakika? Kullanıcılarınız muhtemelen verilerinin düşündüğünüz kadar sık ​​yenilenmesine gerek duymaz. Geçerli sekme/pencere odakta ise

Seçenek 3

Sadece ajax arama gerçekleştirin. Kullanıcı sayfanıza bakmıyorsa, bildirimleri yoklamak için hiçbir neden yoktur.

Kontrol dışarı Document.hasFocus(): https://developer.mozilla.org/en-US/docs/Web/API/Document/hasFocus

Seçenek 4

bir önbelleğe alma katmanı uygulamak. Hala çok fazla veri talep etmeniz gerektiğini düşünüyorsanız, bu verileri ne kadar çabuk aldığınızı geliştirin. Önbelleğe almayı nasıl uyguladığınız size kalmış, ancak bazı durumlarda yazma/okuma dosyalarının kullanılması bile isteği yerine getirmek için gereken zaman ve kaynak miktarını azaltabilir. Eğer veritabanından bildirimleri aldıktan sonra

basit bir metin dosyasına JSON kaydetmek ve veritabanı veri değişene kadar oradan teslim sonraki resquests var. Bunun performansı iyileştirip iyileştirmediğine bakın.

Önbelleğe almaya daha fazla odaklanmak istiyorsanız, Memcached (https://en.wikipedia.org/wiki/Memcached) veya Redis (https://en.wikipedia.org/wiki/Redis) gibi seçeneklere bakabilirsiniz. daha da iyi performans için birden çok seçenek birleştirerek

deneyin!

+0

Seçenek 3 ve 2'yi severim. Seçenek 2 ile ilgili olarak, Facebook'un nasıl bir şey aldığını veya facebook sohbetinin nasıl çalıştığını biliyor musunuz? Hem telefon hem de masaüstünden aynı anda gerçekten gerçek zamanlı olduğunu düşünüyorum. –

+0

Özellikle nasıl çalıştığını bilmiyorum ama evet sohbet gerçek zamanlı olur. Ancak, Facebook'un bunu yapmak için çok kaynağı var. Düşük hacimli web barındırıcısında bir sohbet uygulaması oluşturmaya çalışmak muhtemelen ideal değildir. – neuromatter

+0

30 saniye ve document.hasFocus kullanarak güncelleştirildi. EP/bellek sızıntısı yok. Teşekkür ederim! –