PHP uyumsuz işlem veya mesaj kuyrukları (CakePHP)

3 Cevap php

Bir XML-RPC API olsa ve bir web arayüzü olsa yüklenen dosyaları işler CakePKP'deki bir web sitesi inşa ediyorum. Dosyalar ClamAV tarafından taranması gereken, küçük vs, üretilen gerekir. Kullanıcı beklemek zorunda olmamalıdır hangi için biraz zaman alır tüm kaynak yoğun çalışması. Yani, genel olarak PHP ve özellikle CakePHP ile uyumsuz işleme içine arıyorum.

Ben umut verici görünüyor CakePHP için MultiTask plugin geldi. Ben de böyle dropr ve beanstalkd gibi çeşitli mesaj kuyruğu uygulamaları üzerinden geldi. Tabii ki, ben de muhtemelen bazı tür Kek Shell'i kullanarak uygulanan, arka plan sürecinin çeşit gerekir. I PHP_Fork, bir çok iş parçacıklı PHP cini uygulamak için kullanarak çoklu görev gördüm.

Ben en iyi şekilde birlikte tüm bu parçaları uyum konusunda bazı tavsiyeler gerekir.

  • PHP ile yazılmış bir uzun süre çalışan daemon olması iyi bir fikir mi? Nelere dikkat etmelidir?
  • Harici mesaj kuyruğu uygulamalarının avantajı nelerdir? Multitask eklentisi harici bir mesaj kuyruğu kullanmak değildir. Bu görevlerini depolamak için bir MySQL tablo kullanarak kendi Rolls.
  • Ne mesaj kuyruğu kullanmalıyım? dropr? beanstalkd? Başka bir şey?
  • Nasıl arka uç işlemci uygulamak gerekir? Bir forking PHP cini iyi bir fikir mi yoksa sadece sorun istiyor?

Benim şu anki planı Multitask eklenti kullanmak ya da bunun yerine kendi MySQL tablo uygulaması beanstald kullanmak için düzenlemek ya da budur. Kuyruktaki İşler sadece bir görev adı ve parametreleri bir dizi oluşabilir. PHP daemon gelen işler için izlemek ve çocuğu parçacıkları için onları geçecekti. Sadece verilen parametreler ile CakePHP Görevi yürütülür.

Herhangi bir görüş, tavsiye, yorum, gotchas veya alevler bu konuda?

3 Cevap

I BeanstalkD ve işleri almak ve sonra onları hareket PHP ile yazılmış bir arka uç ile mükemmel sonuçlar yaşadım. Ben sarılmış gerçek iş-çalışan Çıktıktan bile (ben script bunu kontrol ettiğinde, bir 'exit(UNIQNUM);' yapmak ve irade aslında çıkış sürece) eğer çalışmasını sağlamak için bir bash-script. Bu şekilde, yeniden başlatılması PHP komut dosyası kullanılmış olabilir herhangi bir bellek aşağı temizler ve yeniden çalıştırıldığında her 25/50/100 işleri başlayabilirsiniz.

Bunu kullanarak avantajlar bir çift, bir BeanstalkD iş haline öncelikleri ve gecikmeler ayarlayabilirsiniz olduğunu - "düşük öncelikli bu çalıştırmak, ancak 10 saniye boyunca başlamak yok". Ben de (30 saniye sonra tekrar 5 saniye içinde, şimdi bu çalıştırın ve) bir anda işler çok sayıda sıraya ettik.

Büyük bir varsa yani uygun ağ yapılandırması (ve ağınızın geri kalanı için erişilebilir bir IP adresi üzerinde çalışan) ile, aynı zamanda, tek bir sunucu üzerinde bir beanstalkd deamon çalıştırın ve diğer makinelerin bir dizi boynuzsuz olabilir oluşturuluyor görevleri sayısı, çalışma sunucular arasında kapalı bölünmüş olabilir. Görevlerin belirli bir dizi belirli bir makinede çalıştırmak gerekiyorsa, ben (dosya yüklemeleri için yararlı) küresel o makinenin bizim küme içinde benzersiz olmalıdır hostname, değilse bir 'tüp' oluşturduk. Ben sık sık başvurmak web sayfası kendisi gelmeden olacağını URL'ye başvurmak önce dosya sistemine bitmiş küçük görüntüleri dönen, resim boyutlandırma için mükemmel çalıştı bulundu.

Ben aslında (zaten birkaç milyon canlı istekleri ile itti ettik kodu için bazı teknikler dahil) benim blog için bu çok konu hakkında bir yazı dizisi yazmaya başlamak üzereyim - Benim URL benim {[(0)] bağlantılı olduğu } Burada, Stackoverflow üzerinde.

(Ben Beanstalkd konusunda bir series of articles yazılı ve işlerin kuyruk ettik)

Eğer beanstalkd gibi bir ileti kuyruğu kullanıyorsanız istediğiniz gibi, (hatta aynı sunucuda) gibi pek çok süreci başlayabilir. Her çalışan işlem kuyruğundan bir iş almak ve bunu işleyecek. Eğer daha fazla kapasiteye ihtiyacınız varsa, daha fazla işçi ve daha fazla sunucu ekleyebilirsiniz.

Bir tek dişli işçisi hakkında güzel bir şey, bir süreç içinde senkronizasyon ile uğraşmak zorunda kalmamasıdır. Jobqueue emin hiçbir iş iki kez ele alınacaktır yapacaktır.

Ayrıca Amazon SQS EC2 ile birlikte kullanılmak üzere incelemeye değer olabilir?