Çok büyük bir süreç job'ing cron'nun tavsiye gerekir

5 Cevap php

Ben harici bir hizmet verileri çekiyor ve verileri veritabanına kaydeder bir PHP komut dosyası var. Bir keresinde (ben bin olmasını bekliyoruz hangi) sistemdeki her kullanıcı için her dakika çalıştırmak için bu komut dosyası gerekir. Benim soru dakikada, kullanıcı başına bu çalıştırmak için en etkili yolu nedir, nedir? İlk başta ben, benim veritabanından tüm kullanıcı kimlikleri kapmak bir işlevi var kimlikleri üzerinde yineleme ve her biri için görevi gerçekleştirmek düşündüm, ama ben kullanıcı sayısı büyüdükçe, bu artık uzun sürer, ve düşünüyorum 1 dakikalık aralıklarla girer. Belki kullanıcı kimlikleri sıraya olmalı, ve her biri için ayrı ayrı görevi yerine? Bu durumda, ben devam etmek için nasıl aslında emin değilim.

Herhangi bir tavsiye için şimdiden teşekkür ederiz.

Edit

Oddthinking sorusunu yanıtlamak için:

Ben aynı zamanda her kullanıcı için işlemleri başlatmak istiyorum. Her kullanıcı için işlemi tamamlandığında, tekrar işlemine başlamak, sonra 1 dakika beklemek istiyorum. Yani her kullanıcı için her süreç asenkron olmalıdır varsayalım - user 1 için işlem kullanıcı 2 için süreci hakkında bakım gerekir.

Sims 'soruyu yanıtlamak için:

Ben harici bir hizmet üzerinde hiçbir kontrole sahip ve dış hizmet kullanıcıları benim veritabanında kullanıcıları olarak aynı değildir. Ben herhangi bir diğer betik dilleri bilmiyorum korkuyorum, bu yüzden bunu yapmak için PHP kullanmak gerekir.

5 Cevap

Yani, bana bu düz başlayalım: Bir dış hizmet sorgulama (ne SABUN MYSQL?) Her veritabanında her kullanıcı için dakika ve aynı veritabanında sonuçlarını depolamak. Bu doğru mudur?

Bu bir tasarım sorunu gibi görünüyor.

Dış hizmet kullanıcıların veritabanı kullanıcıları olarak aynı ise, belki de iki daha yakından yapılandırılmalıdır. PHP bu verileri senkronizasyonu için gitmek için yolu ise bilmiyorum. Daha fazla ayrıntı verirseniz, biz başka bir çözüm düşünmek olabilir. Eğer harici bir hizmet kontrolü iseniz, veri bulunuyor hatta veritabanına doğrudan bu hizmet dökümü isteyebilirsiniz. Diğer bazı eşitleme mekanizması daha iyi olabilir.

DÜZENLEME

Bu daha sonra kronolojik olarak görülebilir bir kullanıcı için veri depolayan bir uygulama yapıyoruz gibi görünüyor. Kullanıcı istediğinde, aksi takdirde sen de sadece veri getirebilir olabilir.

  1. Seferde tüm kullanıcı kimlikleri getir.

  2. Onlar üzerinde (alınıyor veri her kullanıcı için benzersiz olduğunu varsayarak) teker teker yineleme ve (PHP parçacığı AFAIK yoktur gibi burada yaratıcı olmak zorundasınız) bunları tüm olmasını istediğiniz gibi her istek için bir süreci diyoruz Aynı anda yürütülen ve bir kullanıcı verilerini geri vermezse gecikmiş değil.

  3. Işlem verileri en kısa sürede iade edilir gibi db içine geri yerleştirin gerektiğini söyledi.

Cron iş için doğru olmak gelince: Sürece anda çalışan yukarıdaki cron işleri binlerce işleyebilir yeterince güçlü bir sunucu var gibi, ince olmalıdır.

Birkaç PHP ile yaratıcı alabilir. Emin değilim, ama PHP için her CLI çağrısı yeni bir PHP süreç başlarsa, o zaman bunu böyle yapabilirdi.

foreach ($users as $user)
{
    shell_exec("php fetchdata.php $user");
}

Bu hepsi çok ağır olduğunu ve bunu PHP ile çabuk halletmek için beklememelisiniz. Bazı testler yapmak. Bunun için benim sözüme etmeyin.

Ben doğru özetleme muyum?

Sen dakikada görevler binlerce yapmak istiyorum, ama zaman içinde hepsini bitirmek eğer emin değil misiniz?

Eğer program üzerinde çalıştırmaya başladığınızda ne karar vermeniz gerekir.

  • Eğer bitene kadar devam, ve sonra hemen üzerinde başlar?
  • Eğer bitirene kadar devam etmeyin, sonra bir dakika bekleyin ve sonra baştan başlamak?
  • Eğer var her yerde, işlemi iptal, ve sonra baştan başlamak mı?
  • Eğer (şu andan itibaren sadece her 2 dakikada bir gibi) sıklığını yavaşlatmak mı?
  • Eğer aynı anda çalışan iki süreç var ve sonraki çalışma daha hızlı olacağını umuyoruz (bir birikim ilk defa açılıyor eğer bu iş olabilir, bu yüzden ikinci run hızlı çalışacaktır.)

Bu soruların cevapları uygulamaya bağlıdır. Cron Eğer cevap bağlı için doğru araç olmayabilir. Sen daha kalıcı çalıştıran bir süreç olan ve kendisini zamanlama olabilir.

Veritabanları seferde kayıtları yığınları işlem yapılır. Bunları tek-tek işleme ediyorsanız, sorun arıyoruz. Bir TEK (karmaşık) sorgusu yürüterek, etkilenen kullanıcıların tüm bilgi alınır, böylece "her dakika" görevi kadar toplu bir yol bulmak gerekir; o zaman, sonuç üzerinde PHP işlem yapardı; Daha sonra, başka bir tek sorguda, geri veritabanına sonuçları itmek istiyorum.

Bir çıkmaz tasarıma sahip gibi büyük resmi açıklamasına dayanarak bu sesler. Eğer şu anda çalışma almak mümkün ise, büyük olasılıkla çok kırılgan olacak ve tüm ölçek olmaz.

Ben harici bir hizmet üzerinde hiçbir kontrole sahip olursa, o dış hizmet bu gibi komut tarafından dövülmüş alma konusunda mutlu olmayabilir olduğunu tahmin ediyorum. Eğer genel planı ile onlara yaklaştı mı?

Eğer gerçekten tüm kullanıcıların her zaman yapmak gerekiyor mu? Kullanıcıların "güncellemeleri" ihtiyacı olduğu konusunda daha seçici olmak için kullanabileceğiniz damgası herhangi bir tür var mı? Eğer biraz daha iyi golü tanımlamak eğer belki daha spesifik tavsiye vermek mümkün olabilir.

Eşzamanlı kullanıcıların işleme çalıştırmak isteyen sizin açıklama göz önüne alındığında ...

Akla atlar basit çözüm kullanıcı başına bir konu olmasıdır. Windows'ta, ipler süreçler daha ucuzdur.

Ancak, konuları ve süreçleri kullanmak ister, aynı anda çalışan binlerce sahip neredeyse kesinlikle işlemez.

Bunun yerine, pool parçacığı var. Havuz boyutu bir anda kaç Konuları makine can rahat sap tarafından belirlenir. Ben 30-150 gibi rakamlar kadar gitmek isteyebilirsiniz gibi yaklaşık olması beklenir, ancak donanım kapasitesi üzerinde çok bağlıdır, ve büyüklük, başka bir sipariş dışarı olabilir.

Her iplik paylaşılan bir kuyruk, süreç onu işlenmiş olması nedeniyle bir sonraki kullanıcı kapmak ve belki de işlenmelidir önce hangi bir tarih, sıranın sonunda geri koymak istiyorum.

(Miktarı ve işlem tipine bağlı olarak, bu veritabanı olmayan veritabanı ile ilgili işlem ile aşırı değildir sağlamak için veritabanına ayrı bir kutu üzerinde yapılabilir.)

Bu çözüm her zaman makineyi aşırı yükleme olmadan, birçok kullanıcı olarak olabildiğince işleme olmasını sağlar. Kullanıcı artar sayısı arttıkça, daha az sıklıkla işlenmiş, ama her zaman olduğu gibi hızlı bir donanım sağlayacaktır gibidir.