Код: Выделить всё
protected function getDb()
{
$db = \Yii::$app->db;
if (!$db->isActive) {
$db->close();
$db->open();
}
return $db;
}
Код: Выделить всё
protected function getDb()
{
$db = \Yii::$app->db;
if (!$db->isActive) {
$db->close();
$db->open();
}
return $db;
}
Что-то я плохо понял что вы имели ввиду. Предлагаете с сервера веб-сокетов слать еще куда-то запрос на сохранение? Почему не в базу сразу?rak писал(а): ↑2021.04.07, 17:43 а зачем там вообще бд?
ratchet можно использовать чисто как сервер для вебсокетов, т.е. он о базе вообще может ничего не знать.
отправка сообщения происходит аяксом, там сообщение сохраняется и отправляется в ratchet, которые отправляет его подписчикам
http://socketo.me/docs/push вот тут с примерами есть
А как ратчет получит этот список от контроллера? Вообщем как-то сложно слишком. У меня очень простенький чат для общений заказчика и исполнителя на сайте. Там всего два пользователя на одну комнату всегда. Лучше скажите мне как прокинуть подключение в метод save модели!rak писал(а): ↑2021.04.07, 17:52 1. клиент из браузера шлет аякс запрос - отправка сообщения
2. на сервере сообщение сохраняется в бд и формируется список получателей для ратчета
3. этот список получателей и сообщение отправляется в ратчет, который и доставляет сообщения подписчикам
т.е. вебсокет сервер о бд вообще ничего не знает. по ссылке выше есть пример(для чата будет немного сложнее, но смысл тот же)
Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.
Я в принципе согласен, но я все равно не понял как контроллер будет связываться с веб-сокетом. И самое главное - у нас тут сраки, пардон сроки, горят... Сегодня надо проект сдавать и некогда переделывать. Возможно потом доработаю если время будет. Скажите мне как в метод save передать подключение пожалуйста!proctoleha писал(а): ↑2021.04.07, 21:24 Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.
И держать постоянное соединение с БД - это ужас, это неверное решение
Через ZeroMQ.Brainfuck писал(а): ↑2021.04.08, 09:30Я в принципе согласен, но я все равно не понял как контроллер будет связываться с веб-сокетом.proctoleha писал(а): ↑2021.04.07, 21:24 Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.
И держать постоянное соединение с БД - это ужас, это неверное решение
Что такое ZeroMQ? Блин, а на русском есть?rak писал(а): ↑2021.04.08, 09:44 Через ZeroMQ.
В документации ratchet это все есть, нужно просто открыть и прочитать
http://socketo.me/docs/push
Я плохо знаю английский, а с гугл-транслейтом не особо удобно читать статьи с кодом. Можете для начала хотя-бы устно описать как вы представляете себе эту схему? Ну вот например вы писали:
Я не понял как ратчет узнает о том что в очереди появилось новое сообщение? Контроллер то его запихнет в очередь, но ратчет - это просто запущенный пхп скрипт, который не может параллельно еще мониторить очередь сообщений.
1. Подключение zmq к вебсокет серверу
Код: Выделить всё
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('message', array($pusher, 'onBlogEntry'));
Код: Выделить всё
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($entryData));
Ещё раз, вебсокет сервер должен заниматься только поддержкой подключений клиентов и отправкой им данных при необходимости. Больше в нем не должно быть ничего. Остальная логика должна быть в обычном yii приложении.
Та вроде нету никаких особых проблем и с ratchetproctoleha писал(а): ↑2021.04.15, 06:31 Могу ошибаться, давно это было, но с ratchet, когда я с ним работал, все было непросто.
Применительно к web для общения через сокет предпочтительной использовать js, т.е. открыли страницу, по протоколу wss установили соединение с сокетом, и мама не горюй
С ratchet, насколько я помню, так не получилось. Подробности уже забыл. У них вроде как своя библиотека для js