Вход

Просмотр полной версии : [Вопрос] Автоматическое переподключение игроков после рестарта сервера.



Betta
18.08.2017, 21:18
Приветствую. У меня возникла небольшая проблема. Я делал систему перезагрузки сервера таким образом, чтобы после нее (перезагрузки) игроки автоматически переподключались на сервер и им не приходилось перезапускать клиент. Суть проблемы в том, что когда происходит перезагрузка, мой клиент переподключает быстрее, чем мод успевает подключиться к базе данных MYSQL, хотя код подключения к базе находится в самом начале паблика OnGameModeInit. Кикает с причиной "сервер недоступен" так как он еще не успел прогрузиться. Собственно вопрос, можно ли как-то поставить задержку на переподключение клиента с самого сервера? Ведь на адванс-рп во время рестарта игроков не отключает. Или там это происходит из-за того, что между игроком и сервером есть задержка, за которую сервер успевает загрузить все данные из базы данных, а у меня её нет, потому что я захожу на локальный сервер?

Вот лог:
[20:10:41] - Reload
[20:10:53] - Kicked M: [0]
[20:10:53] - Подключение к базе данных выполнено

Daniel_Cortez
19.08.2017, 13:26
Ведь на адванс-рп во время рестарта игроков не отключает. Или там это происходит из-за того, что между игроком и сервером есть задержка, за которую сервер успевает загрузить все данные из базы данных, а у меня её нет, потому что я захожу на локальный сервер?
Так может быть там и нет переподключения к БД при рестарте? Можно сохранить хендл подключения в чём-то, что сервер SA-MP не обнуляет/удаляет при перезагрузке мода (т.е. точно не в обычные переменные или PVar'ы, на счёт SVar'ов точно не помню). Например, использовать стандартные функции setproperty (http://pro-pawn.ru/showthread.php?8911-setproperty), getproperty (http://pro-pawn.ru/showthread.php?8920-getproperty), existproperty (http://pro-pawn.ru/showthread.php?8930-existproperty) и deleteproperty (http://pro-pawn.ru/showthread.php?8931-deleteproperty): с помощью setproperty сохранить хендл подключения в свойстве "db_handle", затем при загрузке сервера с помощью existproperty проверить, существует ли свойство "db_handle" - если да, то был именно рестарт сервера, а не простой запуск, и вместо того, чтобы подключаться заново к БД, нужно достать сохранённый хендл ещё действительного подключения с помощью getproperty и удалить свойство "db_handle" с помощью deleteproperty, чтобы не занимало лишнее место в памяти.

P.S.: Сам с MySQL не работал, но надеюсь, вам хватит примеров кода из статей по ссылкам выше.

$continue$
19.08.2017, 23:09
Можно ещё хранить в Redis (http://forum.sa-mp.com/showthread.php?t=628477), но нужно, чтобы Redis был установлен на сервере.

vasyok28
19.08.2017, 23:53
Рестар каким образом реализовал? У меня допустим во время рестарта крашу мод и хост его поднимает, и так я решил твою проблему, тут еще от хоста зависит через какое время будет поднимать серв

Hecf
20.08.2017, 10:53
/rcon gmx сила

StevenH
20.08.2017, 16:14
/rcon gmx сила

Не решает проблему данной темы

Betta
20.08.2017, 17:11
Так может быть там и нет переподключения к БД при рестарте? Можно сохранить хендл подключения в чём-то, что сервер SA-MP не обнуляет/удаляет при перезагрузке мода (т.е. точно не в обычные переменные или PVar'ы, на счёт SVar'ов точно не помню). Например, использовать стандартные функции setproperty (http://pro-pawn.ru/showthread.php?8911-setproperty), getproperty (http://pro-pawn.ru/showthread.php?8920-getproperty), existproperty (http://pro-pawn.ru/showthread.php?8930-existproperty) и deleteproperty (http://pro-pawn.ru/showthread.php?8931-deleteproperty): с помощью setproperty сохранить хендл подключения в свойстве "db_handle", затем при загрузке сервера с помощью existproperty проверить, существует ли свойство "db_handle" - если да, то был именно рестарт сервера, а не простой запуск, и вместо того, чтобы подключаться заново к БД, нужно достать сохранённый хендл ещё действительного подключения с помощью getproperty и удалить свойство "db_handle" с помощью deleteproperty, чтобы не занимало лишнее место в памяти.

P.S.: Сам с MySQL не работал, но надеюсь, вам хватит примеров кода из статей по ссылкам выше.


А в этом случае данные из баз, к примеру, домов, автомобилей и т. д. успеют загрузится? Не случился ли такого, что переподключившийся игрок введет пароль и окажется в нулевых координатах из-за того, что его дом не прогрузился? Либо если произойдет ошибка на хостинге, в следствии чего будет утеряна связь с базой данных - сервер все равно будет продолжать слать запросы к ней а игроки будут заходить на сервер, где ничего не загружено? В теории такая реализация не выглядит надежно, но я ,возможно, чего-нибудь да не учитываю.

- - - Добавлено - - -


Можно ещё хранить в Redis (http://forum.sa-mp.com/showthread.php?t=628477), но нужно, чтобы Redis был установлен на сервере.

Хм, может пригодиться. Спасибо за такую штучку.

- - - Добавлено - - -


Рестар каким образом реализовал? У меня допустим во время рестарта крашу мод и хост его поднимает, и так я решил твою проблему, тут еще от хоста зависит через какое время будет поднимать серв

Через OnGameModeExit.

- - - Добавлено - - -

Изначально у меня была идея с перехватом паблика подключения игрока с проверкой на рестарт, после чего посредством таймера заставлять его немного подождать, секунд скажем 3-5. Чем может быть плох такой вариант?

vasyok28
20.08.2017, 17:28
Почему не сделать при подключение игрока на сервер проверку если сервер соединился с базой данных тогда выводим диалог авторизации/регистрации иначе диалог с сообщением "Пожалуйста подождите идет настройка игрового режима" и потом через несколько секунд дать диалог авторизации/регистарции, элементарные вещи в павн

Betta
21.08.2017, 23:47
Решил все же использовать таймер, чтобы дать время на загрузку, а после уже продолжать подключение игрока. А способом Даниэля воспользовался для определения того, что произошел рейстарт, ведь кроме автоматического в определенный момент, сервер могут перезагружать администраторы. Всем спасибо.

Daniel_Cortez
22.08.2017, 10:59
Возможно, немного поздно, но всё же.


А в этом случае данные из баз, к примеру, домов, автомобилей и т. д. успеют загрузится?
Зависит чисто от вас и вашего кода. Если всё сделать грамотно (например, не загружать каждый дом отдельным запросом), то можно успеть всё прогрузить, пока игрок вводит пароль. Тем более, если вы поняли основную идею из моего предыдущего поста, вам не нужно будет даже ждать, пока сервер подключится заново к БД - вы будете использовать соединение, которое было создано ещё до рестарта.


Можно ещё хранить в Redis (http://forum.sa-mp.com/showthread.php?t=628477), но нужно, чтобы Redis был установлен на сервере.
Хотелось бы увидеть хоть один крупный российский хостинг для SA-MP, на котором поддерживается Redis.


Изначально у меня была идея с перехватом паблика подключения игрока с проверкой на рестарт, после чего посредством таймера заставлять его немного подождать, секунд скажем 3-5. Чем может быть плох такой вариант?
Дайте игроку ввести пароль - за это время данные о домах, машинах и т.д. уже могут успеть загрузиться. Если не успеют, заставляйте игрока ждать перед загрузкой всех данных его аккаунта.

Betta
22.08.2017, 17:37
Возможно, немного поздно, но всё же.


Зависит чисто от вас и вашего кода. Если всё сделать грамотно (например, не загружать каждый дом отдельным запросом), то можно успеть всё прогрузить, пока игрок вводит пароль. Тем более, если вы поняли основную идею из моего предыдущего поста, вам не нужно будет даже ждать, пока сервер подключится заново к БД - вы будете использовать соединение, которое было создано ещё до рестарта.


Хотелось бы увидеть хоть один крупный российский хостинг для SA-MP, на котором поддерживается Redis.


Дайте игроку ввести пароль - за это время данные о домах, машинах и т.д. уже могут успеть загрузиться. Если не успеют, заставляйте игрока ждать перед загрузкой всех данных его аккаунта.


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