• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Простой скрипт объединения серверов 1.1

Нет прав для скачивания

Gaikotsu

яжпрограммист
Легенда
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Эксперт
Знаток
Просветитель
Магистр реакций
Знаток письма
Куратор Данных
Медаль Благодарности
Старожил II степени
Старожил I степени
Победитель в номинации 2020
Победитель в номинации 2019
Клиент разработчик
Преподаватель
За веру и верность форуму
Победитель в номинации 2018
Медаль за активность на Форуме
За заслуги перед форумом
Web разработчик
Разработчик
За знание датапака
За знание ядра
Сообщения
1 519
Розыгрыши
0
Решения
24
Репутация
6 004
Реакции
2 579
Баллы
2 188
Пользователь Gaikotsu разместил новый ресурс:

Простой скрипт объединения серверов - Простой скрипт объединения серверов на базе OverWorld/LostWorld

Получил в пм уже несколько просьб выложить/продать скрипт объединения серверов, фрагменты которого я привел в качестве примера в Объединение двух серверов
И решил в итоге выложить один из старых вариантов оного скрипта, как основу/пример для тех кому захочется тоже написать свое для данного дела.

Код простой и понятный - думаю разберетесь без проблем.

Узнать больше об этом ресурсе...
 

Gaikotsu обновил(а) ресурс Простой скрипт объединения серверов новой записью:

правки для работы скрипта под новыми версиями php

Поправил скрипт на тему работы под новыми версиями php - поменял работу с базой на работу через расширение mysqli, вместо mysql, т.к. в 7.4 второе расширение полностью удалили.

Узнать больше об этом обновлении...
 
Тоже занимался слиянием, правда на джаве.
Там есть плюс
Не знаю как на пхп
Но на джаве можно при запуске ГСа дать два конекта к разным бд
+ Ид факторинг
И вместо того чтобы реплейсить/вставлять ОБЖ ид - просто генерировать новые (соответственно совпадений не будет)
Правда запаристо делать каждую таблицу чтобы хранить данные (время норм ушло)
Получается считываем-проверяем на совпадение ид (если совпало, генерируем новые)-кидаем в кеш все это дело, пока не запишем все таблицы
И в конце уже запись во вторую бд
Чуть позже под хайд лично скину ради интереса если хочешь
 
Ну подобное тоже могу в целом без особых проблем написать по идее, но твой способ уж очень гемморойный :)
Проще уж как у меня - просто вычислить максимально задействованный UID на конечной бд и уже от него пляша просто генерить новые при переносе.
 
И в конце уже запись во вторую бд
Если случится ошибка во время записи во вторую БД, тогда же придется полностью бэкап делать (а это 5-10 минут, если база нормальная) и результат ошибки как правило в консоль MySQL выводится недостаточно подробно, ты можешь увидеть только начало запроса в которой произошла ошибка.


Там есть плюс
Не знаю как на пхп
Но на джаве можно при запуске ГСа дать два конекта к разным бд
Этот "плюс" имеют все языки программирования, хоть 100 тыс. коннектов к разным бд.


И вместо того чтобы реплейсить/вставлять ОБЖ ид - просто генерировать новые (соответственно совпадений не будет)
Нет, не соответственно.
Ты генерируешь новый уникальный object_id пристаиваешь его предмету, и потом изменяешь этот object_id в других таблицах, которые взаимодействуют с items и тут случается нежданчик, оказывается в другой таблицы существует такой же object_id предмета, хотя в items слот ID свободный. И не важно по какой причине он есть. Просто он существует. И у тебя случается ошибка.


Эти всё трюки хороши над маленькой базой чистенькой бд, однако, если сервер эксплуатируют много лет, он пережил многое, сервер жирный, более 10к персонажей, сотня миллионов предметов, то неизбежно придется столкнуться с проблемами и потребуется другой подход.
 
  • Мне нравится
Реакции: kick
Если случится ошибка во время записи во вторую БД, тогда же придется полностью бэкап делать (а это 5-10 минут, если база нормальная) и результат ошибки как правило в консоль MySQL выводится недостаточно подробно, ты можешь увидеть только начало запроса в которой произошла ошибка.



Этот "плюс" имеют все языки программирования, хоть 100 тыс. коннектов к разным бд.



Нет, не соответственно.
Ты генерируешь новый уникальный object_id пристаиваешь его предмету, и потом изменяешь этот object_id в других таблицах, которые взаимодействуют с items и тут случается нежданчик, оказывается в другой таблицы существует такой же object_id предмета, хотя в items слот ID свободный. И не важно по какой причине он есть. Просто он существует. И у тебя случается ошибка.


Эти всё трюки хороши над маленькой базой чистенькой бд, однако, если сервер эксплуатируют много лет, он пережил многое, сервер жирный, более 10к персонажей, сотня миллионов предметов, то неизбежно придется столкнуться с проблемами и потребуется другой подход.
для чаров и итемов новая генерация обжекта, пробовал на 3к персах, 30к данных по скилам, все гуд было
персы
Код:
if (System.currentTimeMillis() > Long.parseLong(lastAccess) + TimeUnit.DAYS.toMillis(daysNotCopy)) {
                    _objectNotCopy.add(obj_Id);
                    continue;
                }
                int newObjId = IdFactory.getInstance().getNextId();
                _objectReplace.put(obj_Id, newObjId);
                int newClanObjId = IdFactory.getInstance().getNextId();

предметы

Код:
if (_objectNotCopy.contains(owner_id))
                    continue;
                if (_objectReplace.containsKey(owner_id))
                    owner_id = _objectReplace.get(owner_id);
                else continue;
                object_id = IdFactory.getInstance().getNextId();
соответственно во всех других таблицах заменяется ид также (но там взаимодействие с чар обжектом, поэтому просто с _objectReplace свапаем обжект чара)
 
для чаров и итемов новая генерация обжекта, пробовал на 3к персах, 30к данных по скилам, все гуд было
персы
Код:
if (System.currentTimeMillis() > Long.parseLong(lastAccess) + TimeUnit.DAYS.toMillis(daysNotCopy)) {
                    _objectNotCopy.add(obj_Id);
                    continue;
                }
                int newObjId = IdFactory.getInstance().getNextId();
                _objectReplace.put(obj_Id, newObjId);
                int newClanObjId = IdFactory.getInstance().getNextId();

предметы

Код:
if (_objectNotCopy.contains(owner_id))
                    continue;
                if (_objectReplace.containsKey(owner_id))
                    owner_id = _objectReplace.get(owner_id);
                else continue;
                object_id = IdFactory.getInstance().getNextId();
соответственно во всех других таблицах заменяется ид также (но там взаимодействие с чар обжектом, поэтому просто с _objectReplace свапаем обжект чара)
Я не на что не намекаю, но вот реализация на Java, если вдруг нужно еще:
PS: Не реклама) В комментах есть пересобранная на Maven'е версия без хайда.
 
Назад
Сверху Снизу