Мне нравится писать PHP-скрипт, который будет работать в фоновом режиме в Linux.
Я пытаюсь выяснить, как можно отправить и получить метаданные между клиентом PHP Daemon (script) и браузером?
Я думал, что мог бы включить обработку http-запроса в самого демона, но скрипт демона мог получать 500-1000 запросов каждую секунду. Поэтому http-запрос в самом демоне не будет хорошим решением.
Redis или ZeroMQ являются решением этой проблемы? Что-то вроде этого:
(browser clients) <-----> redis <-----> PHP Daemon Script
Если PHP Daemon отправляет сообщение клиенту, браузер должен немедленно получить метаданные через ajax (длинный опрос).
Крис Бранд дал вам ответ, веб-розетки. Я просто хочу немного подробнее рассказать о вашем вопросе, чтобы указать на некоторые заблуждения, которые у вас есть.
Единственный эффективный способ сделать не-http соединение из браузера это WebSockets — это единственный интерфейс, с которым браузер должен взаимодействовать с внешним сервером, не включая полные издержки http.
Ваша диаграмма:
(browser clients) <-----> redis <-----> PHP Daemon Script
… Похоже, что Redis рассматривает протокол обмена данными, но это не хранилище данных. Вы бы не передавали сообщение из браузера на PHP-скрипт, использующий redis, больше, чем вы бы использовали MySQL для той же задачи. Несмотря на это, на первый взгляд кажется, что Redis не способен напрямую получать соединение с веб-сокетом, поэтому вы не можете подключить браузер напрямую к нему в любом случае, поэтому картинка будет выглядеть примерно так:
(browser clients) <-----> PHP Daemon Script <-----> redis (or any other data store)
Вы Можно если хотите, используйте ZMQ для управления своим общением, и для этого могут быть веские причины, но это зависит от конкретного приложения. В любом случае, ZMQ будет жить на вершине websockets, и добавьте свой собственный бренд накладных расходов, чтобы сделать это. Тем не менее, он предназначен только для такого рода сообщений большого объема.
Мое предложение состоит в том, чтобы изучить использование веб-сокетов напрямую для связи с вашим бэкэндом. Крис Брэнд сделал еще одно хорошее предложение, чтобы изучить использование node.js, но кривая обучения (хотя и относительно небольшая, если вы знакомы с JS) может не стоить этого для этой итерации вашего проекта. Если у вас возникнут проблемы с надежностью обмена сообщениями / соединениями, вы можете посмотреть, что ZMQ может вам предложить.
Если вы хотите, чтобы браузер получал обратную связь в режиме реального времени через длительный опрос … Я не думаю, что Redis — это вариант. Насколько я знаю, Redis не допускает длинных запросов на опрос … если значение не существует на момент запроса … он будет возвращать ноль.
Мое предложение будет использовать что-то вроде веб-сокетов. В PHP есть несколько библиотек, которые работают с веб-сокетами, одна из которых мне знакома: http://socketo.me/. Однако это будет означать, что клиент будет напрямую взаимодействовать с вашим PHP-скриптом. Вы можете масштабировать это, добавив балансировщик нагрузки перед ним и имея несколько демонов на разных портах / блоках и т. Д.
Если вам не нужно использовать PHP, я бы предпочел что-то вроде NodeJS. Он создан для того, чтобы делать такие вещи, и он делает по умолчанию то, что Ratchet PHP пытается имитировать.