и спасибо, что взглянули на вопрос.
Фон
У меня есть несколько машин, которые непрерывно порождают несколько (до 300) консольных сценариев PHP в очень короткие сроки. Эти сценарии запускаются быстро (менее секунды) и затем завершаются. Все эти сценарии должны иметь доступ только для чтения к большой структуре trie , которую было бы очень дорого загружать в память каждый раз при запуске каждого из сценариев. Сервер работает под управлением Linux.
Мое решение
Создайте демон C, который хранит структуру trie в памяти и получает запросы от клиентов PHP. Он получит запрос от каждого из клиентов PHP, выполнит поиск структуры памяти и ответит ответом, спасая сценарии PHP от выполнения этой работы. И запросы, и ответы являются короткими строками (не более 20 символов)
Моя проблема
Я очень плохо знаком с демонами C и межпроцессным взаимодействием. После долгих исследований я сузил выбор до очереди сообщений и доменных сокетов Unix. Очереди сообщений кажутся адекватными, потому что я думаю (я могу ошибаться), что они ставят в очередь все запросы для демона, чтобы ответить на них последовательно. Доменные сокеты Unix, похоже, проще в использовании. Однако у меня есть различные вопросы, на которые я не смог найти ответы:
- Как PHP-скрипт может отправлять и получать сообщения или использовать сокет UNIX для связи с демоном? И наоборот, как демон C отслеживает, на какой процесс PHP он должен отправить ответ?
- Большинство примеров демонов, которые я видел, используют бесконечный цикл while с состоянием сна внутри. Мой демон должен обслуживать много соединений, которые могут быть установлены в любое время, и задержка ответа является критической. Как отреагирует демон, если PHP-скрипт отправляет запрос во время сна? Я читал о опросе и опросе, будет ли это правильный способ ожидания полученного сообщения?
- Каждый процесс PHP всегда отправляет один запрос, а затем будет ожидать ответа. Мне нужно убедиться, что если демон не работает или недоступен, процесс PHP будет ожидать ответа в течение заданного максимального времени, и если ответ не будет получен, он будет продолжаться независимо от зависания. Можно ли это сделать?
Фактический поиск структуры данных выполняется очень быстро, мне не нужно какое-либо сложное многопоточное или подобное решение, так как я считаю, что обработки запросов способом FIFO будет достаточно. Мне также нужно, чтобы это было просто глупо, поскольку это критически важный сервис, и я довольно новичок в этом типе программ. (Я знаю, но я действительно не могу обойти это, и опыт обучения будет отличным)
Я был бы очень признателен за фрагменты кода, которые проливают свет на конкретные вопросы, которые у меня есть. Также приветствуются ссылки на руководства и указатели, которые помогут мне лучше понять этот мрачный мир IPC низкого уровня.
Спасибо за вашу помощь!
Обновление
Теперь, зная гораздо больше, чем я задавал этот вопрос, я просто хотел показать всем, кто заинтересован в том, что и инфраструктура Thrift и ZeroMQ делают фантастическую работу абстрагироваться от жесткого программирования на уровне сокетов. Thrift даже бесплатно предоставляет вам леса для сервера!
На самом деле, вместо того, чтобы выполнять всю тяжелую работу по созданию сетевого сервера, рассмотрите возможность написания кода сервера приложений, используя хороший асинхронный сервер, который уже решил эту проблему для вас. Конечно, серверы, использующие асинхронный ввод-вывод, отлично подходят для сетевых приложений, которые не требуют интенсивной обработки ЦП (или же блоков цикла событий).
Примеры для python: Twisted , gevent . Я предпочитаю gevent, и я не включаю торнадо, потому что он ориентирован на сторону HTTP-сервера.
Примеры для Ruby: EventMachine
Конечно, Node.js в настоящее время является по умолчанию выбором для асинхронного сервера.
Если вы хотите углубиться, прочитайте C10k Problem и Сетевое программирование Unix .