PHP: multithreaded PHP / Web Servisleri?

7 Cevap php

Selamlar tüm!

Ben bir web hizmeti (eBay) istekleri binlerce ve binlerce yürütmek konusunda bazı sıkıntılar yaşıyorum, ben günde 5 milyon aramaların bir sınırı var, bu yüzden o sorun yok ucunda bulunmaktadır.

10.000 isteklerini her 5 dakikada her dakika - Ancak, ben 1.000 işlemek nasıl anlamaya çalışıyorum.

Basically the flow is: 1) Get list of items from database (1,000 to 10,000 items) 2) Make a API POST request for each item 3) Accept return data, process data, update database

Açıkçası bir döngü içinde bu çalıştıran tek bir PHP örneği imkansız olurdu.

PHP bir çok iş parçacıklı dil değil farkındayım.

I tried the CURL solution, basically: 1) Get list of items from database 2) Initialize multi curl session 3) For each item add a curl session for the request 4) execute the multi curl session

Yani 1,000-10,000 GET istekleri meydana hayal edebiliyorum ...

Bu yaklaşık bir ya da iki dakika içinde meydana gelen, ancak, sadece 100-200 aslında işlenen 1.000 öğeleri, ben sınırlamak Apache ve MySQL çeşit isabet olduğumu düşünüyorum 100-200 istekleri etrafında, ok?

Ama bu onun neredeyse kendime bir DoS saldırısı performans gibi, gecikmeye gelmez.

Ben bu sorunun üstesinden nasıl olacağını merak ediyorum? Ne web hizmetinden dönüş verilerden 10.000 web servis taleplerini ve 10.000 MySQL güncellemeler yapmak zorunda ... Ve bu en az 5 dakika içinde yapılması gerekiyorsa.

Ben Zend Framework ile PHP ve MySQL kullanıyorum.

Teşekkürler!

7 Cevap

I've had to do something similar, but with Facebook, updating 300,000+ profiles every hour. As suggested by grossvogel, you need to use many processes to speed things up because the script is spending most of it's time waiting for a response. You can do this with forking, if your PHP install has support for forking, or you can just execute another PHP script via the command line.

exec('nohup /path/to/script.php >> /tmp/logfile 2>&1 & echo $!'), $processId);

Hangi "yığın" işlemek için bunu söylemek için komut satırında php script parametreleri (getopt) geçebilir. Sen ana komut komut hala çalışıyorsa eğer işlemi id kontrol ederek görmek için bir uyku / kontrol döngüsü yapmak olabilir. Ben CPU yükü oldukça yüksek olsun hangi noktada bu şekilde aynı anda çalışan 100 komut, kadar test ettik.

Multi-curl ile çoklu süreçleri birleştirmek ve kolayca gerekenleri yapmak gerekir.

Benim iki öneri (a) gerçek darboğazlar ve mümkün olan her yerde, (b) istifleme ve cacheingini kullanmak nerede bazı kıyaslama öğrenmek için yapmanız.

Mysqli çoklu ifade sorgularını sağlar, böylece kesinlikle toplu o veritabanı güncellemeleri olabilir.

Web hizmetine http istekleri olsa da, daha büyük olasılıkla suçlu vardır. Eğer, belki, bir tek çağrısından daha fazla bilgi alabilirsiniz görmek için kullandığınız API edin? Iş kırmak için, belki de tek bir ana komut bir API çağrı yapar ve bir dosya veya memcached sonuçları saklar, her biri ayrı ayrı süreçlerin bir demet dışarı kabuk istiyorum. Master periyodik sonuçlarını okumak ve db güncelleyebilirsiniz. (Çoklu süreçleri tarafından güvenli okuma ve yazma için veri deposu döndürmek için dikkatli.)

Daha iyi gereksinimlerini anlamak için, must sadece PHP sizin çözümü uygulamak? Yoksa başka bir dilde yazılmış başka bir kısmı ile bir kısmını PHP arayüz olabilir?

Eğer başka bir dil için gidemedim, belki arka planda değil apache üzerinden çalışan php script olarak bu güncelleştirme gerçekleştirmek için çalışın.

Basit bir kullanım durumda Brent Baisley tavsiye takip edebilirsiniz.

Bir robuts çözüm oluşturmak istiyorsanız, o zaman yapmanız gerekir:

  • süreç kuyruğu olacak veritabanındaki bir tablo eylemlerin bir temsilini kurmak;
  • bu sıra pop ve eylem süreci bir senaryo kurmak;
  • Bu komut dosyasını her x çalışacak bir cron daemon kurmak.

Eğer çalışan OS paralellik yeteneklerini kullanarak ve ebay yanıt alıyor zaman asılı değil 1000 PHP komut olabilir bu şekilde.

Bu sistemin gerçek avantajı tam olarak ayarlayarak görev atmak ateş kontrol edebilirsiniz ki:

  • bir PHP komut dosyası yok istek sayısı;
  • Kuyruktaki eylem sırası / sayı / tip / önceliği;
  • numara veya komut cron çalışır.

Teşekkürler müthiş ve hızlı cevaplar için herkes!

Brent Baisley ve e-satis gelen tavsiye oldukça ben daha önce yaptığım gibi CURL kullanarak alt süreçlerinin yürütülmesi daha güzel çalışıyor, çatallaşma benim apache bağlantı sınırı dışarı max konular etrafında alır güzel de, büyük bir yük kapalı alır.

Tekrar teşekkürler!

PHP okuyuculu olmadığı doğrudur, ama kesinlikle çoklu süreçleri ile kurulum olabilir.

Ben açıklayan birini resemebles bir sistem oluşturduk. Bu bir döngü içinde çalışan ve temelde bir arka plan işlemidir oluyor. Bu toplu işleme ve tek bir kontrol süreci için 8 süreçlerine kadar kullanır.

I süreçler arasında bir iletişim olması gerekmez çünkü biraz basitleştirilmiş. Her şey çok her işlem veritabanından alınan tüm bağlamıyla kökenli bir veritabanı bulunur.

Here is a basic description of the system. 1. Start control process 2. Check database for new jobs 3. Spawn child process with the job data as a parameter 4. Keep a table of the child processes to be able to control the number of simultaneous processes.

Ne yazık ki bu tip uygulama için PHP kullanmak yaygın bir fikir gibi görünmüyor, ve ben gerçekten düşük seviyeli işlevlerinin sarıcılarıdır yazmak zorunda kaldım.

manual, bu fonksiyonlarla ilgili bir bölüm vardır, ve o da IPC izin için yöntemler olduğunu görünür.

PCNTL çatallaşma / çocuk süreçleri kontrol etmek işlevlere sahiptir ve Semaphore IPC'yi kapsar.

Bu ilginç kısmı ben başka programları çalıştırmak, gerçek PHP kodu değil kapalı çatal yapabiliyor olmam.