mysql теряет соединение

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

mysql теряет соединение

Сообщение Brainfuck »

Сделал чат на yii2 и ratchet. Проблема в том что периодически mysql закрывает соединение (has gone away). Видимо из-за того что долго висит (там же скрипт сервера должен постоянно запущен быть). Как это можно пофиксить? Единственный вариант смог придумать это сделать метод типа такого:

Код: Выделить всё

protected function getDb()
{
	$db = \Yii::$app->db;

	if (!$db->isActive) {
		$db->close();
		$db->open();
	}

	return $db;
}
И передавать его результат во все запросы (one, all и пр). Но я не знаю как прокинуть его в метод save модели ActiveRecord. Он не принимает подключение как остальные методы.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

а зачем там вообще бд?
ratchet можно использовать чисто как сервер для вебсокетов, т.е. он о базе вообще может ничего не знать.
отправка сообщения происходит аяксом, там сообщение сохраняется и отправляется в ratchet, которые отправляет его подписчикам
http://socketo.me/docs/push вот тут с примерами есть
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

rak писал(а): 2021.04.07, 17:43 а зачем там вообще бд?
ratchet можно использовать чисто как сервер для вебсокетов, т.е. он о базе вообще может ничего не знать.
отправка сообщения происходит аяксом, там сообщение сохраняется и отправляется в ratchet, которые отправляет его подписчикам
http://socketo.me/docs/push вот тут с примерами есть
Что-то я плохо понял что вы имели ввиду. Предлагаете с сервера веб-сокетов слать еще куда-то запрос на сохранение? Почему не в базу сразу?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

1. клиент из браузера шлет аякс запрос - отправка сообщения
2. на сервере сообщение сохраняется в бд и формируется список получателей для ратчета
3. этот список получателей и сообщение отправляется в ратчет, который и доставляет сообщения подписчикам

т.е. вебсокет сервер о бд вообще ничего не знает. по ссылке выше есть пример(для чата будет немного сложнее, но смысл тот же)
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

rak писал(а): 2021.04.07, 17:52 1. клиент из браузера шлет аякс запрос - отправка сообщения
2. на сервере сообщение сохраняется в бд и формируется список получателей для ратчета
3. этот список получателей и сообщение отправляется в ратчет, который и доставляет сообщения подписчикам

т.е. вебсокет сервер о бд вообще ничего не знает. по ссылке выше есть пример(для чата будет немного сложнее, но смысл тот же)
А как ратчет получит этот список от контроллера? Вообщем как-то сложно слишком. У меня очень простенький чат для общений заказчика и исполнителя на сайте. Там всего два пользователя на одну комнату всегда. Лучше скажите мне как прокинуть подключение в метод save модели!
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: mysql теряет соединение

Сообщение proctoleha »

Brainfuck писал(а): 2021.04.07, 17:45 Что-то я плохо понял что вы имели ввиду. Предлагаете с сервера веб-сокетов слать еще куда-то запрос на сохранение? Почему не в базу сразу?
Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.

И держать постоянное соединение с БД - это ужас, это неверное решение
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: mysql теряет соединение

Сообщение proctoleha »

Давайте проведем простую аналогию: вот есть несколько комнат, в каждой стоит какое-то устройство, которое общается с внешним миром, и потребляет электричество. Пока связи нет электричество не потребляется. Пришел сигнал - подключились, что-то сделали, отключились.

Можно реализовать др. поведение - все устройства постоянно подключены к электричеству. Но, тогда время от времени будет срабатывать автомат, т.к. будет превышение нагрузки. И мы, этот автомат, будем постоянно передергивать. Оно нам точно надо? К чему это сможет привести?
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

proctoleha писал(а): 2021.04.07, 21:24 Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.

И держать постоянное соединение с БД - это ужас, это неверное решение
Я в принципе согласен, но я все равно не понял как контроллер будет связываться с веб-сокетом. И самое главное - у нас тут сраки, пардон сроки, горят... Сегодня надо проект сдавать и некогда переделывать. Возможно потом доработаю если время будет. Скажите мне как в метод save передать подключение пожалуйста!
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

Brainfuck писал(а): 2021.04.08, 09:30
proctoleha писал(а): 2021.04.07, 21:24 Потому что есть такая штука в ООП, как разделение ответственности. Каждый класс должен заниматься своим делом. Веб сокет должен рассылать сообщения, а другая сущность должна делать что-то другое: сохранять в БД, писать в лог, дублировать в телегу и т.д.

И держать постоянное соединение с БД - это ужас, это неверное решение
Я в принципе согласен, но я все равно не понял как контроллер будет связываться с веб-сокетом.
Через ZeroMQ.
В документации ratchet это все есть, нужно просто открыть и прочитать ;)
http://socketo.me/docs/push
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

rak писал(а): 2021.04.08, 09:44 Через ZeroMQ.
В документации ratchet это все есть, нужно просто открыть и прочитать ;)
http://socketo.me/docs/push
Что такое ZeroMQ? Блин, а на русском есть?
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

Вопрос актуален! Объясните пожалуйста по русски как это сделать? Я не понял...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

там есть пример, что именно в нем не понятно?
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: mysql теряет соединение

Сообщение Brainfuck »

rak писал(а): 2021.04.14, 17:05 там есть пример, что именно в нем не понятно?
Я плохо знаю английский, а с гугл-транслейтом не особо удобно читать статьи с кодом. Можете для начала хотя-бы устно описать как вы представляете себе эту схему? Ну вот например вы писали:
rak писал(а): 2021.04.07, 17:43 ratchet можно использовать чисто как сервер для вебсокетов, т.е. он о базе вообще может ничего не знать.
отправка сообщения происходит аяксом, там сообщение сохраняется и отправляется в ratchet, которые отправляет его подписчикам
Я не понял как ратчет узнает о том что в очереди появилось новое сообщение? Контроллер то его запихнет в очередь, но ратчет - это просто запущенный пхп скрипт, который не может параллельно еще мониторить очередь сообщений.

И потом, ведь подключение к базе нужно не только для вставки новых сообщений. Есть и операции получения данных. И прочие... Много всякой логики уже реализовано. Я как-то плохо понимаю как это все через контроллер будет работать...
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

Brainfuck писал(а): 2021.04.14, 17:20 Я не понял как ратчет узнает о том что в очереди появилось новое сообщение? Контроллер то его запихнет в очередь, но ратчет - это просто запущенный пхп скрипт, который не может параллельно еще мониторить очередь сообщений
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'));
2. отправка сообщения из контроллера в вебсокет сервер

Код: Выделить всё

    $context = new ZMQContext();
    $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
    $socket->connect("tcp://localhost:5555");

    $socket->send(json_encode($entryData));
Это куски кода из документации ;)
Brainfuck писал(а): 2021.04.14, 17:20 И потом, ведь подключение к базе нужно не только для вставки новых сообщений. Есть и операции получения данных. И прочие... Много всякой логики уже реализовано. Я как-то плохо понимаю как это все через контроллер будет работать...
Ещё раз, вебсокет сервер должен заниматься только поддержкой подключений клиентов и отправкой им данных при необходимости. Больше в нем не должно быть ничего. Остальная логика должна быть в обычном yii приложении.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: mysql теряет соединение

Сообщение proctoleha »

Могу ошибаться, давно это было, но с ratchet, когда я с ним работал, все было непросто.
Применительно к web для общения через сокет предпочтительной использовать js, т.е. открыли страницу, по протоколу wss установили соединение с сокетом, и мама не горюй :)
С ratchet, насколько я помню, так не получилось. Подробности уже забыл. У них вроде как своя библиотека для js

Потом пробовал https://github.com/walkor/Workerman
С ним дело пошло веселее. Общение шло по стандартному протоколу wss, напрямую, с использованием встроенных возможностей js. Так что можно посмотреть в его сторону
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: mysql теряет соединение

Сообщение rak »

proctoleha писал(а): 2021.04.15, 06:31 Могу ошибаться, давно это было, но с ratchet, когда я с ним работал, все было непросто.
Применительно к web для общения через сокет предпочтительной использовать js, т.е. открыли страницу, по протоколу wss установили соединение с сокетом, и мама не горюй :)
С ratchet, насколько я помню, так не получилось. Подробности уже забыл. У них вроде как своя библиотека для js
Та вроде нету никаких особых проблем и с ratchet :)
Ответить