Как выполнить IPC между клиентами PHP и сервером C Daemon?

и спасибо, что взглянули на вопрос.

Фон
У меня есть несколько машин, которые непрерывно порождают несколько (до 300) консольных сценариев PHP в очень короткие сроки. Эти сценарии запускаются быстро (менее секунды) и затем завершаются. Все эти сценарии должны иметь доступ только для чтения к большомуTrie структура, которую было бы очень дорого загружать в память каждый раз, когда запускается каждый из скриптов. Сервер работает под управлением Linux.

Мое решение
Создайте демон C, который хранит структуру trie в памяти и получает запросы от клиентов PHP. Он получит запрос от каждого из клиентов PHP, выполнит поиск структуры памяти и ответит ответом, спасая сценарии PHP от выполнения этой работы. И запросы, и ответы являются короткими строками (не более 20 символов)

Моя проблема
Я очень плохо знаком с демонами C и межпроцессным взаимодействием. После долгих исследований я сузил выбор до очереди сообщений и доменных сокетов Unix. Очереди сообщений кажутся адекватными, потому что я думаю (я могу ошибаться), что они ставят в очередь все запросы для демона, чтобы ответить на них последовательно. Доменные сокеты Unix, похоже, проще в использовании. Однако у меня есть различные вопросы, на которые я не смог найти ответы:

Как скрипт PHP может отправлять и получать сообщения или использовать сокет UNIX для связи с демоном? И наоборот, как демон C отслеживает, на какой процесс PHP он должен отправить ответ?Большинство примеров демонов, которые я видел, используют бесконечный цикл while с условием сна внутри. Мой демон должен обслуживать много соединений, которые могут быть установлены в любое время, и задержка ответа является критической. Как отреагирует демон, если PHP-скрипт отправляет запрос во время сна? Я читал о опросе и опросе, будет ли это правильный способ ожидания полученного сообщения?Каждый процесс PHP всегда отправляет один запрос, а затем ожидает получения ответа. Мне нужно убедиться, что если демон не работает или недоступен, процесс PHP будет ожидать ответа в течение заданного максимального времени, и если ответ не будет получен, он будет продолжаться независимо от зависания. Можно ли это сделать?

Фактический поиск структуры данных очень быстрый, мне не нужно никаких сложных многопоточных или подобных решений, так как я считаю, что обработки запросов способом FIFO будет достаточно. Мне также нужно, чтобы это было просто глупо, поскольку это критически важный сервис, и я довольно новичок в этом типе программ. (Я знаю, но я действительно не могу обойти это, и опыт обучения будет отличным)

Я был бы очень признателен за фрагменты кода, которые проливают свет на конкретные вопросы, которые у меня есть. Также приветствуются ссылки на руководства и указатели, которые помогут мне лучше понять этот мрачный мир IPC низкого уровня.

Спасибо за вашу помощь!

Обновить

Зная гораздо больше сейчас, чем когда я задавал этот вопрос, я просто хотел указать на всех, кто заинтересован в том, чтобы обабережливость рамки иZeroMQ проделайте фантастическую работу по абстрагированию жесткого программирования на уровне сокетов. Thrift даже бесплатно предоставляет вам леса для сервера!

На самом деле, вместо того, чтобы выполнять всю тяжелую работу по созданию сетевого сервера, попробуйте написать код сервера приложений, используя хороший асинхронный сервер, который уже решил эту проблему для вас. Конечно, серверы, использующие асинхронный ввод-вывод, отлично подходят для сетевых приложений, которые не требуют интенсивной обработки ЦП (или же блоков цикла событий).

Примеры для Python:скрученный, GEvent, Я предпочитаю gevent, и я не включаю торнадо, потому что он ориентирован на сторону HTTP-сервера.

Примеры для Ruby:EventMachine

Конечно,Node.js в основном это выбор по умолчанию для асинхронного сервера в настоящее время.

Если вы хотите пойти глубже, прочитайтеC10k Проблема, а такжеUnix Сетевое Программирование.

Ответы на вопрос(7)

Ваш ответ на вопрос