Как правильно организовать WebSocket и Laravel 5?

Всем привет. Очень нужно объяснение одной проблемы, попробую коротко.

Начну с задачи: нужно сделать поисковую выдачу на вебсокетах. То есть пользователь ввел запрос, браузер соединился по вебсокету с сервером, при нахождении очередного результата сервер отправляет его браузеру и браузер отображает. Вебсокет нужен потому, что поиск может длиться хоть полчаса (очень большое количество разных источников), и использовать тут ajax я не хочу (чтобы не опрашивать сервер постоянно и не нагружать его), а просто загрузка страницы и вовсе исключена в силу постановки самой задачи (долгое время выполнения). Очень привлекательной выглядит событийная модель вебсокета, в общем.

Теперь о проблеме. Я прочитал и просмотрел много материалов про связку, которая, видимо, самая популярная. Ставится node.js, в браузер грузится socket.io. Браузер общается с node.js. Сам node.js общается с laravel через redis. Laravel броадкастом рассылает ивент с именем канала, он (видимо), пишется в redis, а node.js слушает redis, подхватывает новый ивент и рассылает его всем браузерам, слушающим этот канал.

Но мне нужно:

а) Передать параметры поиска в Laravel из браузера
б) Вернуть результат обработки от Laravel конкретному браузеру, а не всем подряд вообще

Пункт "б" вообще нигде не раскрывается. Если пользователь не авторизован, то совершенно (мне) не понятно как laravel будет передавать что-то ему, ведь о том, кто именно запрашивает результат laravel не знает.
Я нигде не могу найти ответы на эти вопросы и даже не понимаю, туда ли я двигаюсь. Кто-нибудь сталкивался, может подсказать?

Дополню, что и выкидывать отсюда Laravel не хочется. Там уже есть сам функционал поиска. Писать демон на PHP и как-то засовывать туда этот функционал - дело сомнительное...

Дополню, что вызывать как-то Laravel из node.js тоже не подходит - тогда придется ждать, когда ларавел полностью отработает. По идее надо как-то сделать так, чтобы при пользовательском запросе лара начал искать, и в процессе поиска, прямо в огромном цикле кидал события наружу о найденных новых данных.

Не исключено, что я вообще не понимаю как это работает и может ли так работать, т.к. сталкиваюсь первый раз.
  • Вопрос задан
  • 3445 просмотров
Пригласить эксперта
Ответы на вопрос 1
abler98
@abler98
Software Engineer
поиск может длиться хоть полчаса (очень большое количество разных источников)


Может тогда стоит отправлять запрос на поиск, ставить его в очередь, а результат записывать в БД, тогда пользователю не нужно будет ждать.

Сюда же можно и общение с сервером через сокеты прикрутить, чтобы сразу отобразить результат поиска, если пользователь ещё никуда не ушёл, но в базу всё равно лучше записывать результаты такой длительной операции.

а) Передать параметры поиска в Laravel из браузера

Как я и сказал, отправляем обычный запрос на сервер, но сам поиск делаем в очереди. По завершению поиска пишем результат в БД и выполняем broadcast нужного события.

б) Вернуть результат обработки от Laravel конкретному браузеру, а не всем подряд вообще

Для этого есть приватные каналы, подробнее в документации: https://laravel.com/docs/5.4/broadcasting#authoriz...

P.S. Laravel позволяет реализовать это без особых усилий, уже всё готово, нужно просто внимательно почитать документацию.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы