Форум программистов, компьютерный форум, киберфорум
PHP: Laravel
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.08.2017
Сообщений: 35
1

Laravel broadcast. Прослушка событий на стороне бека

18.03.2024, 14:50. Показов 479. Ответов 4

Author24 — интернет-сервис помощи студентам
В laravel есть встроенный функционал broadcast, трансляция событий в ws сервер. Есть большая статься на сайте лары, где описывается удобный функционал трансляции событий. Описан пакет Laravel Echo, который позваляет удобно читать эти события на фронте.

Однако у меня возникла необходимость делать наоборот. Фронт отправляет сообщения в ws сервер, а бек должен читать эти сообщения. И вот функционала прослушки сообщений в laravel имено на стороне бека нет вообще, почему-то.

В результате долгих поисков решения было сделано следующее:
Я использовал пакет beyondcode/laravel-websockets, который в свою очередь под капотом использует достаточно не простой пакет ratchet.
В доке ratchet приводится пример класса, который должен реализовывать интерфейс MessageComponentInterface
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
 
class Chat implements MessageComponentInterface {
    public function onOpen(ConnectionInterface $conn) {
    }
 
    public function onMessage(ConnectionInterface $from, $msg) {
    }
 
    public function onClose(ConnectionInterface $conn) {
    }
 
    public function onError(ConnectionInterface $conn, \Exception $e) {
    }
}
Такой же класс я нашел в пакете beyondcode/laravel-websockets и переопределил его в своем приложении. Там в методе onMessage при определенных условиях уже добавил отправку events laravel. Так же это дало возможность отслеживать закрытие ws соединения, что так же очень пригодилось.

Есть ли какой-то более изящный способ реализовать подобный функционал, используя набор фич laravel? В laravel 10 был презентован некий laravel reverb, который так же позволяет развернуть ws-сервер, а так же достаточно легко обходит ограничение в 1024 коннекта, что мне понравилось. Но опять же, нигде, ни слова про возможность прослушки сообщений на стороне бека.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2024, 14:50
Ответы с готовыми решениями:

ServiceWorker прослушка событий на странице
Добрый день! Вот какой вопрос, можно ли в service worker'е написать функцию, которая будет...

Построить треугольник по стороне, противолежащему стороне углу и радиусу вписанной окружности
Построить треугольник по стороне, противолежащему стороне углу и радиусу вписанной окружности.

Клиент/сервер, как установить библиотеки на стороне клиента и на стороне сервера?
Всем здравствуйте. Помогите разобраться вот с чем. Есть такое выражение: &quot;на сторону сервера...

Долго выполняется процесс на стороне сервера. ProgressBar на стороне клиента
Доброго времени суток. На стороне сервера долго выполняется функция (цикл по документам -...

Составить программу для построения ромба по стороне, высоте, стороне и углу, диагоналям
2. Пусть элементами ромба являются сторона (с) и высота(h), сторона (с) и угол (А), диагонали...

4
31 / 25 / 11
Регистрация: 16.06.2020
Сообщений: 150
19.03.2024, 18:54 2
Цитата Сообщение от B_Borzik Посмотреть сообщение
Однако у меня возникла необходимость делать наоборот. Фронт отправляет сообщения в ws сервер, а бек должен читать эти сообщения. И вот функционала прослушки сообщений в laravel имено на стороне бека нет вообще, почему-то.
А чем не устраивает обычный контроллер?
Зачем для этого вообще websocket использовать? Они же для другого предназначены.
0
0 / 0 / 0
Регистрация: 10.08.2017
Сообщений: 35
20.03.2024, 12:14  [ТС] 3
На сайте есть видео. Есть необходимость проверять какая часть видео была просмотрена, а так же отлавливать событие того, когда пользователь закончил смотреть видео.

Для этого было решено сделать ws сервер. Фронт отправляет каждые 5 секунд в ws сервер сообщение о том, на какой секунде просмотра находится пользователь, и с какой скоростью он смотрит видео. Когда пользователь закончил просмотр видео все собранные данные анализируются и формируются конкретные кусочки, которые были просмотрены пользователем. Естественно есть погрешность, но она допустима.

Если использовать обычные http запросы, то есть риск задудосить самого себя. А так же остается проблема с тем чтобы определить когда пользователь закончил просмотр видео, и когда следует произвести анализ полученных данных. Например, если пользователь просто закроет вкладку во время просмотра, я никак не смогу это отследить, а с помощью ws сервера я могу отлавливать закрытие ws соединения. Даже если пользователь просто выключит комп во время просмотра, я все равно смогу отловить разрыв ws соединения и обработать те данные что успел собрать.
0
31 / 25 / 11
Регистрация: 16.06.2020
Сообщений: 150
22.03.2024, 22:31 4
Цитата Сообщение от B_Borzik Посмотреть сообщение
Если использовать обычные http запросы, то есть риск задудосить самого себя.
С чего это? Если ваш обработчик не будет дико тяжелым и тормозным, то никакого риска нет.

Цитата Сообщение от B_Borzik Посмотреть сообщение
А так же остается проблема с тем чтобы определить когда пользователь закончил просмотр видео, и когда следует произвести анализ полученных данных. Например, если пользователь просто закроет вкладку во время просмотра, я никак не смогу это отследить, а с помощью ws сервера я могу отлавливать закрытие ws соединения. Даже если пользователь просто выключит комп во время просмотра, я все равно смогу отловить разрыв ws соединения и обработать те данные что успел собрать.
Ну во первых событие закрытие вкладки браузера (onbeforeunload) можно использовать.
А если комп выключат (или сеть отвалится) вы на сервере всё равно, даже при использовании ws, сразу об этом не узнаете. А узнаете только когда когда таймаут tcp истечет (по умолчанию это, кажется, 2 мин) и сокет отвалится.
Не проще ли просто каждую минуту вызывать обычным http событие что видео было просмотрено: 1, 2, 3 …. минуты, а потом анализировать, до какого момента досмотрели?

Добавлено через 1 час 8 минут
Цитата Сообщение от B_Borzik Посмотреть сообщение
И вот функционала прослушки сообщений в laravel имено на стороне бека нет вообще, почему-то.
Просто веб-сокеты используют именно для доставки событий от сервера, к браузеру.
Хотя, конечно технически на низком уровне, по открытому tcp соединению можно гонять данные в обе стороны… Но для запросов с браузера на сервер используется традиционный http, поэтому этот функционал там не реализован.
1
0 / 0 / 0
Регистрация: 10.08.2017
Сообщений: 35
25.03.2024, 16:19  [ТС] 5
Цитата Сообщение от winch Посмотреть сообщение
Не проще ли просто каждую минуту вызывать обычным http событие что видео было просмотрено: 1, 2, 3 …. минуты, а потом анализировать, до какого момента досмотрели?
Сейчас сообщение отправляется каждые 5 секунд. При отправки каждую минуту будет слишком большая погрешность в измерениях. Многие перематывают видосы туда сюда, просматриват их по несколько раз. Кто-то просто жмет стрелочку вперед чуть ли не каждые пару секунд. Так же в плеере есть возможность просматривать видос на разных скоростях и тд. Кейсов много и отправка запроса каждую минуту даст не просто "грязные данные", а даже вообще не корректные.

Цитата Сообщение от winch Посмотреть сообщение
С чего это? Если ваш обработчик не будет дико тяжелым и тормозным, то никакого риска нет.
Сейчас этот обработчик быстрый, все сообщения, отправляемые каждые 5 секунд пишутся в редис без какой либо обработки. А вот уже после просмотра видео, когда происходит дисконект от ws сервера происходит обработка данных. То есть дисконнект, это своего рода триггер, обозначающий то, что пользователь закончил смотреть видео. И тогда я беру данные из кэша и начинаю их обрабатывать, и вот этот процесс уже не самый быстрый.

Если отказаться от ws, то встает вопрос о том, как тригреить окончание просмотра видео, чтобы произвести анализ полученных данных. А если анализировать данные сразу, при каждом http запросе, который еще и будет отправляться каждые 5 секунд, это будет так себе. Вот тут я боюсь, что нагрузка возрастет значительно.
0
25.03.2024, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2024, 16:19
Помогаю со студенческими работами здесь

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

Алгоритм Кирусе-Бека
Доброго времени суток всем. Вообщем реализовываю алгоритм Кируса-Бека( тут), и по неизвестной мне...

Алгоритм Кируса-Бека на Делфи
Учитывая, что сам алгоритм (функция Итселф) писался с регулярным подглядыванием в надёжный...

Двумерный алгоритм Кируса-Бека
Добрый вечер! Я тут пытаюсь разобратся с алгоритмом, искала в интернете, но все что нахожу написано...

Запись массива с бека на фронт
С бекэнда приходит массив обьектов, типа: Принимаю так: В сервисе getDataset():...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru