В классическом 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? Или это чревато подводными камнями и лучше тащить дополнительный стек технологий. Что выбрать?