PHP isteği dışında (resim boyutlandırma gibi) ağır işleme boşaltması için en iyi yol

5 Cevap php

Ben büyük trafik alacak bir PHP web arayüzü üzerinde çalışıyorum. Bazı ekleme / güncelleme istekleri daha fazla geri alma hızlandırmak için bazı ortak boyutları resized gerekecektir görüntüleri içerir.

Bunu yapmanın tek yolu sunucuda bazı asenkron kuyruğunu kurmak muhtemelen. Örn. PHP istekleri tarafından doldurulur olacak bir görevleri sıra ile bir db bir masa kurmak ve sunucu üzerinde başka bir işlem tablosunu izlemek ve herhangi bir bekleme görevlerini işlemek sağlar. Bunu nasıl yapacaksın? Ne uzun çalışan süreç için uygun bir ortam olurdu? Java, ya da belki daha hafif bir şey yapardı?

5 Cevap

Ne yaptığınızı gerçekten yüksek hacimli ise, o zaman ne arıyorsanız beanstalkd gibi bir şeydir. Bu bir dağıtılmış çalışma sırası işlemcisi. Sadece kuyruğunda bir iş koymak ve daha sonra bunu unutur.

Tabii o zaman kuyruğunu okuma ve çalışma işleme diğer ucunda bir şey gerekir. Bunu yapmanın birden çok yolu vardır.

Kolay iş kuyruğunu okumak ve istekleri işlemek için genellikle yeterince çalışan bir cron işi var muhtemelen. Alternatif iş kullanılabilir hale tarafından uyandırılır kalıcı cini sürecini çeşit kullanabilirsiniz.

Yaklaşım bu tür avantajı çok iş halletmek gerekiyor ve beanstalkd (listners farklı makinelerde olabilir anlamında) dağıtılan prorcessing nasıl işleyeceğini işçilerin sayısını terzi olduğunu.

Sen kuyruk tabloyu kontrol edecek bir cron görevi ayarlayabilirsiniz. Kuyrukta bekleyen eylemleri kolları komut örn yazılmış olabilir php böylece uygulama dilini değiştirmek zorunda değilsiniz.

Ben beanstalkd ile birlikte uzun süren süreç için Perl kullanabilirsiniz. Güzel bir şey Perl için Beanstalkd istemci engelleme rezerv yöntemi olmasıdır. Yapacak bir şey yok olduğunda bu şekilde hemen hemen hiçbir CPU zamanı kullanır. Işini yapmak zorunda kaldığında Ama otomatik işleme başlayacaktır. Çok etkili.

You would want to create a daemon which would "sleep" for a period of time and then check the database for items to process. Once it found items to process, it would process them and then check again as soon as it was done, if no more, then sleep. You can create daemon's in any language, including PHP.

Alternatif olarak, sadece PHP bir script çalıştırmak ve devam olabilir. Script, devam etmeden önce bitirmek arka planda çalıştırmak için PHP beklemek olmaz ki.

exec ("nohup / usr / bin / php-f / yol / / script / script.php> / dev / null 2> & 1 &");

Eğer herhangi bir kuyruk olduğundan arka planda çalışan pek çok süreç olan bitebileceğini beri dikkatli olmak zorunda olsa da.

Sen arka planda görüntü işleme yapmak ve sunucuları yük çıkarmak IronWorker gibi bir hizmeti kullanabilirsiniz. Bir hizmet olduğundan, bir şey veya yukarı başka bir şey kurmak yönetmek için gerek olmayacak ve sen onunla tek bir görüntü yapabilirsiniz eğer, sıfır çaba ile milyonlarca resim büyütülebilir böylece büyüdükçe seninle dönüşebilecek.

Burada görüntü işleme dönüşümlerin bir demet yapmak için nasıl bir makale:

http://dev.iron.io/solutions/image-processing/

Örnekler Ruby vardır, ancak oldukça kolay PHP ile aynı şeyler yapabilirdi.