i dziękuję za spojrzenie na to pytanie.Jak IPC między klientami PHP a serwerem C Daemon?
Tło
mam kilka maszyn, które stale tarło wielokrotność (do 300) skrypty PHP konsoli w bardzo krótkim czasie. Skrypty te działają szybko (mniej niż sekundę), a następnie kończą działanie. Wszystkie te skrypty wymagają dostępu tylko do odczytu do dużej struktury trie, co byłoby bardzo kosztowne, aby załadować je do pamięci za każdym razem, gdy uruchamia się każdy ze skryptów. Na serwerze działa Linux.
Moje rozwiązanie
Utwórz demona C, która utrzymuje strukturę TRIE w pamięci i odbiera żądania od klientów PHP. Otrzyma żądanie od każdego klienta PHP, wykona wyszukiwanie w strukturze pamięci i odpowie odpowiedzą, oszczędzając skrypty PHP przed wykonaniem tej pracy. Oba wnioski i odpowiedzi są krótkie ciągi (nie dłużej niż 20 znaków)
mój problem
Jestem bardzo nowe do demonów C i komunikacji między procesami. Po wielu badaniach ograniczyłem wybór do gniazd kolejki wiadomości i gniazd domenowych systemu Unix. Kolejki wiadomości wydają się odpowiednie, ponieważ myślę (może się mylę), że kolejkują wszystkie żądania demona, aby odpowiedzieć na nie serialnie. Jednak domeny unixowe wydają się łatwiejsze w użyciu. Jednak mam różne pytania, na które nie byłem w stanie znaleźć odpowiedzi:
- W jaki sposób skrypt PHP może wysyłać i odbierać wiadomości lub używać gniazda UNIX do komunikowania się z demonem? Odwrotnie, w jaki sposób demon C śledzi, na jakim procesie PHP ma wysłać odpowiedź?
- Większość przykładów demonów, które widziałem, używa nieskończonej pętli while ze stanem snu wewnątrz. Mój demon musi obsługiwać wiele połączeń, które mogą pojawić się w dowolnym momencie, a opóźnienie odpowiedzi jest krytyczne. Jak demon zadziała, jeśli skrypt PHP wyśle żądanie podczas snu? Czytałem o ankiecie i epolu, czy byłby to właściwy sposób oczekiwania na otrzymaną wiadomość?
- Każdy proces PHP zawsze wysyła jedno żądanie, a następnie czeka na odpowiedź. Muszę się upewnić, że jeśli demon jest wyłączony/niedostępny, proces PHP będzie czekał na odpowiedź przez ustawiony maksymalny czas, a jeśli żadna odpowiedź nie zostanie odebrana, będzie kontynuowana niezależnie od zawieszania. Czy można to zrobić?
Faktyczne wyszukiwanie struktury danych jest bardzo szybkie, nie potrzebuję żadnego skomplikowanego wielowątkowego lub podobnego rozwiązania, ponieważ uważam, że obsługa zgłoszeń w sposób FIFO będzie wystarczająca. Muszę również zachować głupotę, ponieważ jest to usługa o znaczeniu krytycznym, a ja jestem całkiem nowy w tego rodzaju programie. (Wiem, ale naprawdę nie mam na to rady, a nauka będzie wspaniała)
Naprawdę doceniam fragmenty kodu, które rzucają nieco światła na konkretne pytania, które mam. Zapewniam także linki do przewodników i wskaźników, które pomogą mi lepiej zrozumieć ten mroczny świat niskiego poziomu IPC.
Dzięki za pomoc!
Aktualizacja
Wiedząc o wiele bardziej teraz niż ja w czasie z tym pytaniem, chciałem tylko zwrócić uwagę wszystkich zainteresowanych, że zarówno Thrift ramy i ZeroMQ zrobić fantastyczną pracę abstrahując od hotelu trudne, programowanie na poziomie gniazd. Oszczędzanie daje ci nawet rusztowanie na serwer za darmo!
W rzeczywistości, zamiast iść do ciężkiej pracy nad budową serwera sieciowego, rozważ napisanie kodu serwera aplikacji przy użyciu dobrego asynchronicznego serwera, który już rozwiązał problem. Oczywiście serwery korzystające z asynchronicznego IO doskonale nadają się do aplikacji sieciowych, które nie wymagają intensywnego przetwarzania procesora (lub bloków pętli zdarzeń).
Przykłady dla python: Twisted, gevent. Wolę gevent i nie włączam tornada, ponieważ koncentruje się on na stronie serwera HTTP.
Przykłady Ruby: EventMachine
Oczywiście Node.js jest w zasadzie domyślnym wyborem dla serwera async dzisiejszych czasach.
Jeśli chcesz wejść głębiej, przeczytaj C10k Problem i Unix Network Programing.
Tak, demon powinien być odpytywanie i wierzę, że z gniazda unix wszystko co musisz zrobić, to mieć gniazda obsługują skompilowane w PHP .. ale nie jestem całkowicie pewny. – Earlz