Como IPC entre clientes PHP e um servidor C Daemon?

e obrigado por dar uma olhada na questão.

O fundo
Eu tenho várias máquinas que continuamente geram vários (até 300) scripts de console PHP em um período de tempo muito curto. Esses scripts são executados rapidamente (menos de um segundo) e depois saem. Todos esses scripts precisam de acesso somente leitura a um grandetrio estrutura que seria muito cara para carregar na memória cada vez que cada um dos scripts é executado. O servidor executa o Linux.

Minha solução
Crie um daemon C que mantenha a estrutura trie na memória e receba solicitações dos clientes PHP. Ele receberia uma solicitação de cada um dos clientes PHP, executaria a pesquisa na estrutura da memória e responderia com a resposta, salvando os scripts PHP de fazer esse trabalho. Ambos os pedidos e respostas são seqüências curtas (não mais de 20 caracteres)

Meu problema
Eu sou muito novo para daemons C e comunicação entre processos. Depois de muita pesquisa, reduzi as opções para filas de mensagens e soquetes de domínio Unix. As Filas de Mensagens parecem adequadas porque acho (posso estar errado) que elas enfileiram todas as solicitações para o daemon respondê-las em série. Sockets de domínio Unix parecem ser mais fáceis de usar, no entanto. No entanto, tenho várias perguntas sobre as quais não consegui encontrar respostas:

Como um script PHP pode enviar e receber mensagens ou usar um soquete UNIX para se comunicar com o daemon? Por outro lado, como o daemon C rastreia qual processo PHP deve enviar uma resposta?A maioria dos exemplos de daemons que vi usam um loop while infinito com uma condição de sono dentro. Meu daemon precisa atender muitas conexões que podem ocorrer a qualquer momento, e a latência da resposta é crítica. Como o daemon reagiria se o script PHP enviasse um pedido enquanto ele estivesse dormindo? Eu li sobre enquete e epoll, esta seria a maneira correta de esperar por uma mensagem recebida?Cada processo do PHP sempre enviará uma solicitação e, em seguida, aguardará para receber uma resposta. Preciso ter certeza de que, se o daemon estiver inoperante / indisponível, o processo do PHP aguardará uma resposta por um tempo máximo definido e, se nenhuma resposta for recebida, continuará independente, em vez de suspender. Isso pode ser feito?

A pesquisa real da estrutura de dados é muito rápida, não preciso de nenhuma solução complexa de multiencadeamento ou similar, pois acredito que manipular as solicitações de maneira FIFO será suficiente. Eu também preciso manter isso simples, já que este é um serviço de missão crítica, e eu sou relativamente novo nesse tipo de programa. (Eu sei, mas eu realmente não tenho como contornar isso, e a experiência de aprendizado será ótima)

Eu realmente aprecio trechos de código que iluminam as questões específicas que tenho. Links para guias e ponteiros que irão aprofundar minha compreensão neste mundo obscuro de IPC de baixo nível também são bem-vindos.

Obrigado pela ajuda!

Atualizar

Sabendo muito mais agora do que eu fiz na hora de fazer esta pergunta, eu só queria mostrar a alguém interessado que tanto aThrift estrutura eZeroMQ faça um trabalho fantástico de abstrair a programação difícil em nível de soquete. O Thrift até oferece o andaime para o servidor gratuitamente!

Na verdade, em vez de ir para todo o trabalho duro de construir um servidor de rede, considere apenas escrever código de servidor de aplicativos usando um bom servidor assíncrono que já resolveu o problema para você. É claro que os servidores que usam E / S assíncrona são ótimos para aplicativos de rede que não exigem processamento intensivo da CPU (ou então, os blocos do loop de eventos).

Exemplos para python:Torcido, gevent. Eu prefiro gevent e não incluo tornado porque ele é focado no lado do servidor HTTP.

Exemplos para o Ruby:EventMachine

Claro,Node.js é basicamente a escolha padrão para um servidor assíncrono hoje em dia.

Se você quiser ir mais fundo, leia oProblema C10keProgramação de Rede Unix.

questionAnswers(7)

yourAnswerToTheQuestion