Size: a a a

Laravel для начинающих

2020 February 20

D

DK in Laravel для начинающих
Ну получить только те записи,дата окончания,которых не наступила
источник

И

Игорь in Laravel для начинающих
Игорь
Скажите, я правильно понимаю алгоритм работы с вебсокетами?


1. Пользователь отправляет сообщение с формы (или сервер формирует некоторое уведомление)

2. Сообщение принимает код ларавел, в котором выкидывает событие с нужным интерфейсом и методом, в котором указан канал в который его нужно отправить

3. Лара видит, что интерфейс для вещания, поэтому отправляет мессагу пользователя в редис.

4. Редис, получив сообщение выкидывает событие, о получении сообщения, которое слушает сервер (node.js) и с помощью библиотеки, socket.io отправляет его в браузер клиенту (-ам), который подписан на данный канал.

5. На клиенте работает клиентская часть библиотеки socket.io (или laravel-echo), которая может подписать пользователя на конкретные каналы, которые он сможет принимать.

Здесь я не рассматриваю платные сервисы типа pusher, хочу от них уйти.

Это примерно так работает? А то меня летом сокеты ждут. 😊
И еще один вопрос. А пользователь1 не может в консоли добавить себя на прослушивания канала пользователя2? Чтобы читать чужие сообщения/ уведомления?
источник

И

Игорь in Laravel для начинающих
Если да, то как с этим бороться
источник

И

Илья in Laravel для начинающих
DK
Ну получить только те записи,дата окончания,которых не наступила
Можно
источник

D

DK in Laravel для начинающих
спасиб
источник

АО

Александр Орловский in Laravel для начинающих
Игорь
И еще один вопрос. А пользователь1 не может в консоли добавить себя на прослушивания канала пользователя2? Чтобы читать чужие сообщения/ уведомления?
технически канал один для всех юзеров и твой вебсокет сервер разруливает кому что отправлять в конечном счете  исходя из айдишника сокета, пользователь сам по себе не может решить на какой "канал" подписаться, он подписывается просто на события которые твой вебсокет сервак рассылает, а называются эти события для всех юзеров одинаково (по крайней мере пока ты не сделаешь специальную реализацию которая позволяет это делать иначе, из коробки  - нет).  но потребуется ассоциировать конкретного юзера с его сокет айди, поскольку передача сообщений происходит, олбычно с посредничеством твоего пхп приложения. например, когда юзер отправляет сообщение, запрос идет в твое пхп приложение, которое пишет сообщение в бд, а уже потом  броадкастит в вебсокет-сервер это сообщение.  то есть пользователь использует вс-сервер чисто для того чтобы слушать события, для приемки сообщений короче. для того чтобы ассоциировать айдишник юзера с сокет айди на стороне вебсокет сервера, можно юзать какой-то access_token уникальный для каждого пользователя. вот старый драфт как это плюс-минус того как это использовалось в одном из моих приложений:

https://gitlab.com/moofik12/masterhome/-/blob/master/frontend/common/mixins/websocket.js - запрашивает с бека аксесс токен, подписывается на вс сервер, к событию цепляем этот самый аксесс токен

https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/SocketServer.ts  - 36 строчка -регистрация юзера в пуле активных пользователей, 59я - отправака пользователю сообщения  (сообщение берется из очереди рэббита), апдейт дергается вот этим классом  https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/Service/Message/MessageListener.ts
источник

И

Игорь in Laravel для начинающих
Александр Орловский
технически канал один для всех юзеров и твой вебсокет сервер разруливает кому что отправлять в конечном счете  исходя из айдишника сокета, пользователь сам по себе не может решить на какой "канал" подписаться, он подписывается просто на события которые твой вебсокет сервак рассылает, а называются эти события для всех юзеров одинаково (по крайней мере пока ты не сделаешь специальную реализацию которая позволяет это делать иначе, из коробки  - нет).  но потребуется ассоциировать конкретного юзера с его сокет айди, поскольку передача сообщений происходит, олбычно с посредничеством твоего пхп приложения. например, когда юзер отправляет сообщение, запрос идет в твое пхп приложение, которое пишет сообщение в бд, а уже потом  броадкастит в вебсокет-сервер это сообщение.  то есть пользователь использует вс-сервер чисто для того чтобы слушать события, для приемки сообщений короче. для того чтобы ассоциировать айдишник юзера с сокет айди на стороне вебсокет сервера, можно юзать какой-то access_token уникальный для каждого пользователя. вот старый драфт как это плюс-минус того как это использовалось в одном из моих приложений:

https://gitlab.com/moofik12/masterhome/-/blob/master/frontend/common/mixins/websocket.js - запрашивает с бека аксесс токен, подписывается на вс сервер, к событию цепляем этот самый аксесс токен

https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/SocketServer.ts  - 36 строчка -регистрация юзера в пуле активных пользователей, 59я - отправака пользователю сообщения  (сообщение берется из очереди рэббита), апдейт дергается вот этим классом  https://gitlab.com/moofik12/masterhome/-/blob/master/socket-server/src/Service/Message/MessageListener.ts
Спасибо за развернутый ответ.

Но ведь клиентский скрипт говорит: давай буду слушать канал "user:25". Ведь так? Тогда почему он не может слушать заодно и канал "user:26"?
источник

ЕК

Егор Карась in Laravel для начинающих
Игорь
Спасибо за развернутый ответ.

Но ведь клиентский скрипт говорит: давай буду слушать канал "user:25". Ведь так? Тогда почему он не может слушать заодно и канал "user:26"?
Может
источник

АО

Александр Орловский in Laravel для начинающих
Игорь
Спасибо за развернутый ответ.

Но ведь клиентский скрипт говорит: давай буду слушать канал "user:25". Ведь так? Тогда почему он не может слушать заодно и канал "user:26"?
ну, обычно никто не делает каналы user:25, или user:26 ) есть один канал messages, а сервак сам решает какому сокет-айди что послать
источник

ЕК

Егор Карась in Laravel для начинающих
Простой пример:

Юзер заходит в чат и подписывается на каналы: мессагес и усерс, в первом ему сообщения приходят, во втором пользователи в чате.

Это неправильно, просто как пример
источник

АО

Александр Орловский in Laravel для начинающих
поскольку за это отвечает сервер а каждый юзер идентифицирован особым токеном, то  сообщение долетит до предназначенного юзера, и никуа за рамки не выфдет
источник

И

Игорь in Laravel для начинающих
Я понимаю, что есть общий канал, который открывает сокет-соединение. При каждом подключении браузера. А уже внутри программно мы создаем каналы и слушаем их
источник

АО

Александр Орловский in Laravel для начинающих
Игорь
Спасибо за развернутый ответ.

Но ведь клиентский скрипт говорит: давай буду слушать канал "user:25". Ведь так? Тогда почему он не может слушать заодно и канал "user:26"?
вот в моем случае клиентская часть:
https://gitlab.com/moofik12/masterhome/-/blob/master/frontend/common/mixins/websocket.js - здесь устанавливаем соединение с веб сокет сервером
https://gitlab.com/moofik12/masterhome/-/blob/master/frontend/store/notification.js - а здесь подписка на события, событие notification приходит с сервера как раз таки
источник

И

Игорь in Laravel для начинающих
Если обычный чат для всех - то ничего страшного. А если это приватное сообщение, то я не могу понять как это здесь работает
источник

АО

Александр Орловский in Laravel для начинающих
и никакой конкретики  нет, типа user:25, user:26
источник

АО

Александр Орловский in Laravel для начинающих
посмотри, в вебсокет.жс мы шлем аксесс токен, который предварительно запросили с пхпшного бека, аксес токен хранится в бд.
источник

АО

Александр Орловский in Laravel для начинающих
когда человек шлет другому приватное сообщение, то твое пхп приложение достает аксес токен того кто послал, и аксес токен того кому послали
источник

И

Игорь in Laravel для начинающих
источник

АО

Александр Орловский in Laravel для начинающих
и бродкастит сообщения с аксес токенами на вебсокет сервер
источник

И

Игорь in Laravel для начинающих
Да. Надо это дело переварить. И код написать и посмотреть как это работает
источник