Как лучше сделать HTTP SSE (Server Side Events) в PHP приложении?

В классическом PHP приложении крутящемся на Apache возникла необходимость посылать данные клиентам в реальном времени при наступлении определенных событий. Если конкретно, к приложению через API подключаются внешние системы и добавляют в него некие данные, обработчик тут же обрабатывает их и должен в тот же момент уведомить всех пользователей, находящихся на сайте, о поступлении новых данных. Одновременно подключенных клиентов ожидается до 300. Хочется выбрать какой то простой и надежный способ реализации, причем желательно без установки дополнительного стека технологий.
Самый соблазнительный вариант это использовать HTTP SSE. Встроенная и простая поддержка браузерами, автоматическое восстановление коннектов при обрыве. И якобы серверную сторону можно сделать на том же PHP. В интернете много примеров типа этого:
header("Content-Type: text/event-stream");
while (1) {
    echo 'data: xxxxxxxxxxx';
    ob_end_flush();  flush();   sleep(1);
}

Но не понятно, как в таком скрипте лучше дожидаться наступление события в другом PHP скрипте? Циклическим поллингом заниматься точно не хочется. Нужны какие то семафоры или что то в этом духе. Да и не порвет ли Apache долго висящие HTTP соединения, все таки это не совсем стандартное его использование. Как завершать скрипт при отключении клиента?

Еще я смотрел в стороны других вариантов:
- Написать специальный сервер на Node.JS. Вроде он как раз хорошо подходит для подобных вещей. С одной стороны слушаешь API, по которому поступают данные, и раскидываешь поступившие данные по всем висящим SSE подключениям. Но у меня нет опыта работы с Node.JS.
- Использование WebSocket мне показалось избыточным для данной задачи. Мне нужно только рассылать уведомления в одностороннем порядке.
- На Laravel есть решение из коробки: Laravel + Redis + laravel-echo-server (на Node.JS) + Socket.IO + Laravel-Echo. Но как то не хочется тащить весь этот колхоз ради одной простой задачки. В качестве транспорта оно использует WebSocket, а почему то не SSE.

Какое решение лучше выбрать? Пытаться ли обойтись одним голым PHP+Apache и встроенной браузерной поддержкой SSE? Или это чревато подводными камнями и лучше тащить дополнительный стек технологий. Что выбрать?
  • Вопрос задан
  • 2674 просмотра
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега PHP
Что мешает при поступлении новых данных, где-то в бд отмечать, "поступили данные"? А своим скриптом смотришь, есть ли новые данные, если есть, отправлять клиенту. В любом случае надо делать разные скрипты, один для приема данных от сервисов, второй для отправки данных клиенту. И они должны работать независимо. Еще можешь сделать один скрипт, но в нем сделать несколько потоков под задачи.

Явно задача не такая простая как кажется. Одним скриптом с while(true) sleep(1) не обойдешься.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы