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:
- 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?
- 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?
- 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.