Задать вопрос

Как правильно организовать 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 тоже не подходит - тогда придется ждать, когда ларавел полностью отработает. По идее надо как-то сделать так, чтобы при пользовательском запросе лара начал искать, и в процессе поиска, прямо в огромном цикле кидал события наружу о найденных новых данных.

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


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

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

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

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

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

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

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

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

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