Comment l'IPC entre PHP clients et un C Démon de Serveur?

et merci de prendre un coup d'oeil à la question.

L'arrière-plan

J'ai plusieurs machines qui ne cesse de générer plusieurs (jusqu'à 300) de PHP console de scripts dans un très court laps de temps. Ces scripts s'exécutent rapidement (moins d'une seconde), puis sur quitter. Tous ces scripts besoin d'un accès en lecture seule à un grand trie structure qui serait très coûteux pour charger en mémoire à chaque fois l'un des scripts fonctionne. Le serveur fonctionne avec Linux.

Ma solution

Créer un C démon qui maintient le trie de structure dans la mémoire et reçoit les demandes du PHP clients. Il serait de recevoir une demande de la part de chacun de PHP clients, effectuer la recherche sur la structure de la mémoire et de répondre avec la réponse, l'économie de l'scripts PHP de faire ce travail. À la fois les demandes et les réponses sont des chaînes courtes (pas plus de 20 caractères)

Mon problème

Je suis très nouveau à C démons et de communication interprocessus. Après beaucoup de recherches, j'ai rétréci les choix pour les Files d'attente et les sockets de domaine Unix. Files d'attente de messages semblent suffisants parce que je pense (je me trompe peut-être) qu'ils en file d'attente toutes les demandes pour le démon de leur répondre en série. Les sockets de domaine Unix semble plus facile à utiliser, mais. Cependant, j'ai plusieurs questions, je n'ai pas été en mesure de trouver des réponses à:

  1. Comment un script PHP d'envoyer et de recevoir des messages ou d'utiliser une socket UNIX pour communiquer avec le démon? À l'inverse comment le C démon de garder une trace des processus PHP, il doit envoyer une réponse à?
  2. La plupart des exemples de démons que j'ai vu utiliser une boucle while infinie avec un sommeil condition à l'intérieur. Mon démon besoins de service de connexions qui peuvent venir à tout moment, et la latence de réponse est critique. Comment le démon de réagir si le script PHP qui envoie une demande alors qu'il dort? J'ai lu sur le sondage et epoll, serait-ce la bonne façon d'attendre un message reçu?
  3. Chaque processus PHP sera toujours envoyer une demande, puis s'attendre à recevoir une réponse. J'ai besoin de faire en sorte que si le démon est en bas /pas disponible, le processus PHP va attendre une réponse pour un maximum de temps, et si aucune réponse n'est reçue continuera sans égard au lieu de la pendaison. Cela peut-il être fait?

La réelle recherche de la structure de données est très rapide, je n'ai pas besoin de tout un complexe multi-threading ou solution similaire, comme je le crois, de la manipulation du demande dans une FIFO façon de faire assez. J'ai aussi besoin de keep it simple stupid, comme c'est une mission essentielle de service, et je suis assez nouveau à ce type de programme. (Je sais, mais je n'ai vraiment aucun moyen de contourner cela, et de l'expérience d'apprentissage sera grand)

Je voudrais vraiment l'apprécier extraits de code qui fait briller un peu de lumière dans les questions précises que j'ai. Des liens vers des guides et des indicateurs qui permettront d'approfondir ma compréhension dans ce monde glauque de bas niveau de la CIB sont également les bienvenus.

Merci pour votre aide!


Mise à jour

Savoir beaucoup plus maintenant que je l'ai fait au moment de poser cette question, je voulais juste faire remarquer à tous ceux qui souhaitent que les deux L'épargne cadre et ZeroMQ font un travail fantastique de l'abstraction à la dure, prise au niveau de la programmation. L'épargne vous donne même l'échafaudage pour le serveur gratuitement!

En fait, au lieu d'aller tout le travail de construction d'un serveur de réseau, pensez juste à vous écrire des applications de serveur de code à l'aide d'un bon serveur asynchrones qui a déjà résolu le problème pour vous. Bien sûr, les serveurs qui utilisent asynchrone IO sont parfaits pour les applications de réseau qui ne nécessitent pas intensive du PROCESSEUR de traitement (ou la boucle d'événement de blocs).

Exemples pour python: Twisted, gevent. Je préfère gevent, et je ne comprend pas la tornade, car il est axé sur le serveur HTTP de côté.

Exemples pour Ruby: EventMachine

Bien sûr, Node.js est essentiellement le choix par défaut pour un serveur asynchrone de nos jours.

Si vous voulez aller plus loin, lire le C10k Problème, et Unix Réseau De Programmation.

  • Oui, le démon doit être d'interrogation, et je pense qu'avec les sockets unix tout ce que vous avez à faire est de sockets compiler le support en PHP.. mais je ne suis pas complètement sûr
InformationsquelleAutor Alex Recarey | 2009-11-17