1330316 AJAX istekleri benim sunucu çökmesine neden olabilir?

2 Cevap php

Ben tüm ABD eyaletlerinde tüm şehirler için bazı işlem yapacak küçük bir PHP / JavaScript uygulaması inşa ediyorum. Bu (52 x 25.583) toplam kadar yuvarlar = işlenecek gerekecektir 1330316 veya daha az ürün.

Her öğenin işlenmesi kullanıcı 1-2 saat (ya da en azından başka şeyler yaptı ise minimize tutmak) için bu sayfaya bakıyorum olabilir ki yaklaşık 2-3 saniye sürer, bu nedenle olası olacaktır.

Kullanıcıya maksimum geribildirim vermek için, ben, javascript ile temelde böyle bir şey sayfanın işlenmesini kontrol düşünüyordum:

var current = 1;
var max = userItems.length; // 1330316 or less

process();

function process()
{
  if (current >= max)
  {
     alert('done');
     return;
  }

  $.post("http://example.com/process", {id: current}, function()
     {
        $("#current").html(current);
        current ++;
        process();
     }
  );
}

Html i process() fonksiyon denir her güncellenmiş olacak aşağıdaki durum iletisini sahip olacaktır:

<div id="progress">
   Please wait while items are processed.
   <span id="current">0</span> / <span id="max">1330316</span> items have been processed.
</div>

Umarım hepiniz bu çalışmak istiyorum nasıl görebilirsiniz.

Benim tek endişem bu 1330316 istekleri sunucuya aynı anda yapılırsa, bu çöküyor / sunucu aşağı getirdiği bir olasılık olduğunu, yani? Eğer öyleyse ben kullanarak istek başına 2 saniye ekstra bekleme koyarsanız, sleep(3); sunucu tarafı PHP kodu, o daha iyi şeyler yapacak?

Veya kullanıcı apache veya sunucu ile karışıklık beni gerektirmez çağırma gibi hızlı geribildirim gösteren farklı bir mekanizma var mı?

2 Cevap

Eğer sunucu bir cronjob koyarsan, ben çok daha iyi çalışmak istiyorum inanıyorum. Ne gerçek işlem yapmak ve periyodik durumunu (örneğin, her 10 saniye) güncellemek için JavaScript kullanmak için bir cronjob kullanma hakkında?

Daha sonra, ilk adım cronjob PHP kontrol edecek bazı bayrak tetikleyebilir olacaktır. Aktif ise, o görevi (kayıtların processsed gerekir komut söylemek için bazı geçici dosyayı kullanabilirsiniz) yapılmalıdır.

Cronjob görevi yapmak ve sonra, onun yineleme tamamlandığında, bayrağı kapatmak istiyorsunuz.

Bu şekilde, kullanıcı bile uygulamayı kapatın ve daha sonra tekrar kontrol ve sunucu istemci etkinliği tarafından kesintisiz tüm işlem, idare edecek edebilirsiniz.

Sunucu tarafı php komut dosyası içinde bir uyku koyarak sadece daha kötü yapabilir. Bu paralel çalışma / uyku süreçleri artan bellek kullanımına kadar ekler, sayısını artırmak için çıkıyor, etrafında yapışmasını daha süreçlere yol açar.

Çok süreçler paralel olarak yapılabilir ki korkma. Genellikle bir apache server paralel olarak en fazla 150 istekleri işlemek için yapılandırılmış. İyi yapılandırılmış bir sunucu kaynakları (iyi yöneticiler önceden bazı hesaplamalar yapmak) kullanılabilir olandan paralel olarak daha fazla istekleri işlemez. Diğer istekleri beklemek zorunda - ve istekleri sizin sayısı verilen onlar işlenmeden önce zaman aşımı için gidiyoruz muhtemel bulunuyor.

Sizin endişeleri ancak istemci tarafı kaynaklar hakkında olmalıdır ancak script sadece önceki döndü yeni bir istek başlar gibi görünüyor. BTW: Peki aynı IP paralel olarak en fazla 6 isteklerini başlar (hangi tarayıcı olmalıdır) HTTP istemcileri davranıyor.

Update: Yukarıdaki yanında ciddi (önerilen Joel @ gibi benzer) kütle işleme yaklaşım yeniden tasarlama düşünmelisiniz - ama bu başka bir soruya gitmek gerekir.