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:
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!
AtualizarSabendo 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.