Nasıl PHP müşteriler ve C Daemon Server arasındaki IPC için?

4 Cevap php

ve soruya bir göz ayırdığınız için teşekkürler.

The background
I have several machines that continuously spawn multiple (up to 300) PHP console scripts in a very short time frame. These scripts run quickly (less than a second) ve then exit. All of these scripts need read only access to a large trie structure which would be very expensive to load into memory each time each one of the scripts runs. The server runs Linux.

My solution
Create a C daemon that keeps the trie structure in memory ve receives requests from the PHP clients. It would receive a request from every one of the PHP clients, perform the lookup on the memory structure ve respond with the answer, saving the PHP scripts from doing that work. Both requests ve responses vardır short strings (no longer than 20 characters)

My problem
I am very new to C daemons ve inter process communication. After much research, I have narrowed the choices down to Message Queues ve Unix domain sockets. Message Queues seem adequate because I think (I may be wrong) that they queue up all of the requests for the daemon to answer them serially. Unix domain sockets seem to be easier to use, though. However, I have various questions I have not been able to find answers to:

  1. Nasıl bir PHP komut dosyası ileti göndermek ve almak veya daemon ile iletişim kurmak için bir UNIX soket kullanabilir? Tersine nasıl C daemon kendisine bir yanıt göndermek zorunda olan PHP süreci takip ediyor?
  2. Gördüğüm cinleri çoğu örnekleri döngü içinde iken bir uyku koşulu ile sonsuz kullanın. Benim daemon herhangi bir zamvea gelip birçok bağlantılara hizmet ihtiyacı ve tepki gecikme önemlidir. O uyurken PHP komut dosyası bir istek gönderir nasıl cini tepki vereceğini? Ben bu Alınan bir mesajı beklemek doğru yol olacaktır, anket ve epoll okudum?
  3. Her PHP süreci her zaman bir istek gönderecek ve ardından bir cevap almak için bekler. Ben daemon aşağı / kullanılamıyor ise, PHP süreç bir set maksimum süre bir yanıt beklemek emin olmak gerekir, ve hiçbir cevap alınırsa yerine asılı olursa olsun devam edecektir. Bu yapılabilir mi?

Ben bir FIFO şekilde istekleri işleme inanıyorum veri yapısının gerçek arama çok hızlı, ben, herhangi bir karmaşık çoklu iş parçacığı veya benzeri bir çözüm gerekmez yeterli olacaktır. Bu bir misyon kritik hizmet olarak ben de, basit aptal tutmak gerekiyor, ve ben bu tip bir program için oldukça yeni. (Biliyorum, ama ben gerçekten bu çevrede yol yok, ve öğrenme deneyimi büyük olacak)

Ben gerçekten var belirli sorulara biraz ışık parlayacak kod parçacıkları seviniriz. Düşük seviyeli IPC bu karanlık dünyasına benim anlayış daha fazla olacaktır kılavuzları ve işvardırtçileri bağlantıları da açığız.

Yardımlarınız için teşekkürler!


Update

Daha şimdi ben bu soruyu soran vea yaptım daha bilerek, ben sadece Thrift çerçevesi ve ZeroMQ hem de uzak soyutlama harika bir iş yapmak ile ilgilenen herkes için işvardırt etmek istedim Sert, soket-düzey programlama. Tasarruf Hatta ücretsiz sunucu için iskele verir!

Aslında, onun yerine bir ağ sunucusu binanın tüm zor işleri için gitmeyi, sadece zaten sizin için sorunu çözmüş iyi bir uyumsuz sunucusu kullanarak size uygulamaları sunucu kodu yazmadan düşünün. Tabii uyumsuz GÇ kullanmak sunucuları yoğun CPU işleme (veya başka bir olay döngü blokları) gerekmez ağ uygulamaları için mükemmeldir.

Piton için örnekler: Twisted, gevent. Ben gevent tercih ve HTTP sunucusu tarafında odaklanmıştır çünkü kasırga dahil değildir.

Ruby için Örnekler: EventMachine

Eğer derin gitmek istiyorsanız, C10k Problem okumak, ve Unix Network Programing.

4 Cevap

I Thrift ne istediğiniz olduğunu sanıyorum. <-> PHP <-tasarruf-> C + + yapmak için biraz tutkal kodu yazmak olurdu C, ancak bu muhtemelen kendi çalışırken daha sağlam olurdu.

"Sorun" (belki değil?) Kesinlikle SysV yutması, birçok tüketici / üretici var olmasıdır. Mükemmel mümkün olsa mutlaka bir m yoksa ne yaptığınızı için: n üreticiye gerekir: kaynak modeli tüketici, burada bir istek / yanıt modeli var.

Olduğu gibi SysV MQ ile bazı garip hangups alabilirsiniz.

Öncelikle, INET yuva sizin için yeterince hızlı değil emin misin? Unix alan soketleri kullanarak hızlı bir PHP örneği (sadece, tabii ki kod örneği olarak, PHP nokta için () socket_create kullanın) http://us.php.net/socket-create-pair yer almaktadır.

Ayrıca PHP'nin paylaşımlı bellek fonksiyonları http://www.php.net/manual/en/book.shmop.php kullanarak paylaşılan belleğe veri yapısını yük olabilir.

Oh, bu belgelere açık değil ama koordine değişken shmop_open dolar anahtarıdır. Paylaşılan bellek erişimi gerek Her işlem aynı $ anahtarı olmalıdır. Yani, bir süreç $ anahtar ile paylaşılan bellek oluşturur. Onlar aynı $ anahtarını kullanırsanız, diğer işlemler sonra bu paylaşımlı bellek erişebilirsiniz. Ben size $ anahtar için ne gibi seçebilirsiniz inanıyorum.

Ben hiç denemedim rağmen, memcached uygun bir PHP extension homurtu işlerin çoğunu ortadan kaldırmak gerektiğini ile birlikte.

Açıklama: ben örtülü traydan hendek açılması, bunu yaptın, sen düzleştirilmiş tuşlarını kullanarak memcache içine trayın bireysel yaprakları koymak olacağını varsayarak. Bu yaklaşımın fizibilite ve cazibe, tabii ki, birçok ilk faktörler ve en önemlisi veri kaynağı olmasına bağlıdır.