• Страница 1 из 1
  • 1
Модератор форума: Dimitro, LightInDarkness  
Необходима консультация по отправке внутриигровой почты.
aveolona
Капрал
Добрый день, уважаемые форумчане. Подскажите пожалуйста правилен ли ход моих мыслей?

Мне необходимо отправить игроку письмо с вложенным внутри предметом. Для этого я собираюсь произвести средствами PHP два запроса в таблицы `mail` и `mail_items`. В первом из которых я заполню необходимые данные по самому письму, а во втором данные по вложению соответственно. Если игрок в момент отправки письма будет находиться в сети, то он его получит только при повторном входе в игру, следовательно необходимо будет еще добавить проверку на онлайн.

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

P.S. Убедительная просьба, не отпускайте различных шуточек на данную тему и не стройте из себя всезнайку, просто помогите советом. Сразу говорю, метод с SOAP меня не устраивает и ничего более менее толкового на форуме я не нашла, хотя и потратила на это почти полчаса.
Сообщение # 1 отредактировано aveolona - Четверг, 20.08.2015, 13:10
Pallam
Рыцарь
А к чему проверка по онлайну?
На самом то деле, не очень то и важно, в игре игрок или нет, ему просто придется перезайти в игру.

И почему СОАП вас не устраивает? Хламить поток он все равно не будет - расположен он у вас на сервере. Если вне сервера - тогда понятно.

А так - да, все верно.
Сообщение # 2 отредактировано Pallam - Понедельник, 10.08.2015, 16:39
aveolona
Капрал
Pallam, проблема в том, что веб-сайт с базой данных и ядро сервера находятся на двух разных ip адресах. Но вы правы, проверка на онлайн наверное будет лишней. Спасибо за ценный совет.
Сообщение # 3 написано 10.08.2015 в 17:04
Pallam
Рыцарь
Цитата aveolona ()
веб-сайт с базой данных и ядро сервера находятся на двух разных ip адресах

Ну, во-первых.. У меня на машине - 25 разных айпи адресов. Так что это не показатель.
Во-вторых - соап пакетно передает данные в сервер, а значит, единственное что может случится - это загруз канала при огромном сбыте.. Но я не думаю, что у вас будут проблемы поменять канал, если его сможет загрузить именно личный кабинет с магазином =D
Там буквально отправка команды.
можно даже посчитать, сколько байт информации будет передаваться в среднем соапу. Не думаю, что больше 50 байт соап будет грузить за запрос.
Не думаю, что это особо такая проблема...
Сообщение # 4 написано 10.08.2015 в 17:11
aveolona
Капрал
Pallam, помимо лишней нагрузки, как я поняла ничтожной, меня смущает необходимость загрузки и установки дополнительно ПО на сервер для работы SOAP. Мне крайне это не нравится, поэтому хотелось бы реализовать все средствами SQL запросов. Считаете, что все таки лучше использовать SOAP?
Сообщение # 5 отредактировано aveolona - Понедельник, 10.08.2015, 20:07
Pallam
Рыцарь
Цитата aveolona ()
Считаете, что все таки лучше использовать SOAP?

Возможность работать напрямую с консольными командами откуда угодно... Дорого стоит, если честно.
Сообщение # 6 написано 10.08.2015 в 20:27
aveolona
Капрал
Pallam, таким образом я смогу реализовать и отдельную систему для администрирования игрового мира, используя ряд команд для ГМ, верно?
Сообщение # 7 написано 10.08.2015 в 20:34
Pallam
Рыцарь
Цитата aveolona ()
Pallam, таким образом я смогу реализовать и отдельную систему для администрирования игрового мира, используя ряд команд для ГМ, верно?

Что под этим имеется в виду?
Да, можно использовать гм/консольные команды от имени сервера. Если стоит опр. модификация.
Если есть знание и желание - то весь этот список можно вечно дополнять.
Сообщение # 8 написано 10.08.2015 в 20:39
aveolona
Капрал
Pallam, огромное спасибо за ценные советы.
Сообщение # 9 написано 10.08.2015 в 20:40
Кот_ДаWINчи
Чемпион
При работе сервера(нужного мира/реалма) такие изменения как отсылка писем с вложенными предметами нужно делать через СОАП и только через СОАП. При отключенном игровом сервере (мире/реалме) Отсылку надо осуществлять уже через базу, так как СОАП не сработает (сервер то отключен). Так что реализовывать надо ОБА способа отсылки.

Чтобы это понять, надо хорошо разбираться не только в ПХП и МайСКЛ, но и в СИ, а так же структуре и методах работы ЯДРА сервера.

Объясняю почему. При своей работе ядро сервера (по крайней мере старые его версии, такие как 3.3.5) абсолютно не знает что в базу данных пишет информацию не только оно одно, но еще и сайт. Поэтому в ядрах начисто отсутствуют проверки на то, что какие-то посторонние процессы могли внести изменения в базу без его ведома. К тому же, всё это усугубляется тем, что запись данных из памяти производится не моментально после изменения их, а с запаздыванием.
Это конечно не относится к почте, но всякое может быть. При большом онлайне, и приличном потоке писем между пользователями может получится накладка.
Вот примерно такая: два пользователя отправляют одновременно письмо. Первый - из игры. Второй - с сайта. оба прикрепляют к письму предмет. Так вот. И сервер и сайт, обращаясь к базе данных своим путём, получают уникальный идентификатор письма и прикрепленного предмета для отсылки. если в таблице mail этот id выдается автоматически МайСКЛ-ом при создании письма и он уникален, то id письма в таблице mail_items вносится по средствам запроса. получается, что эти два письма будут претендовать на один и тот же id. Отсюда вытекает ситуация, что один из пользователей получит письмо с ДВУМЯ предметами, а второй - или без вложений, или совсем не получит письма.

Вот примерно так я вам могу коротко, на пальцах обрисовать смысл проблемы.
мне фиолетово какой у меня рейтинг, можете поставить хоть минус миллион...
Не в плюсах счастье...
Помогаю тем, кто хочет чтобы ему помогли, а не сделали за него.
Сообщение # 10 написано 12.08.2015 в 22:09
Pallam
Рыцарь
Цитата Кот_ДаWINчи ()
И сервер и сайт, обращаясь к базе данных своим путём, получают уникальный идентификатор письма и прикрепленного предмета для отсылки. если в таблице mail этот id выдается автоматически МайСКЛ-ом при создании письма и он уникален, то id письма в таблице mail_items вносится по средствам запроса. получается, что эти два письма будут претендовать на один и тот же id. Отсюда вытекает ситуация, что один из пользователей получит письмо с ДВУМЯ предметами, а второй - или без вложений, или совсем не получит письма.

Ну вот тут вы брешите, при чем жутко.
Объясняю. При работе со скулями, мускуль, при правильном подходе - блокирует свою строку, пока ее полностью не обработает.
Сервер тоже блокирует строку и при этом никто, кроме того, кто заблокировал не имеет доступа к оной. А значит при попытки одного переписать через права другого - пойдет лажа... Т.е. перезапись не состоится.
Теперь номер два.
INSERT ITEM бла-бла-бла-маил-темлейт (`id`, `bla-bla-bla`) VALUES ((SELECT MAX(`id`) FROM бла-бла-бла-маил-темлейт)+1, 'bla-bla-bla-value');
Фокус понятен?

И третье.
php
if (server_is_online()) {mail_by_soap(char, item);} else {mail_by_sql(char, item);}
Разжувал все идеально?
Сообщение # 11 написано 22.08.2015 в 17:34
Кот_ДаWINчи
Чемпион
Уважаемый Pallam, каждый видит проблему с высоты своих знаний и опыта. Я пишу о том что происходит на реальных серверах с реальным онлайном, человек в 50 и более. И если бы этой проблемы не существовало, то я бы и не написал об этом. Вы же голословно обвиняете меня во вранье, хотя сами даже не поняли смысл моей мысли. А смысл заключается в следующем:
Цитата Кот_ДаWINчи ()
При своей работе ядро сервера (по крайней мере старые его версии, такие как 3.3.5) абсолютно не знает что в базу данных пишет информацию не только оно одно, но еще и сайт. Поэтому в ядрах начисто отсутствуют проверки на то, что какие-то посторонние процессы могли внести изменения в базу без его ведома.

т.е. виновником сей коллизии является само ядро сервера. Если вы не верите мне, то проанализируйте исходники ядра. Я только что специально посмотрел на код в файлах :
Mail.cpp
Mail.h
ObjectMgr.cpp
ObjectMgr.h

Как и ожидалось, но всё остается по прежнему, как и 3-4 года назад. А именно, в файлах менеджера объектов при начале работы с очередным объектом из базы запрашивается куча необходимых данных. В том числе и номер последнего свободного MailId. Потом в файлах работы с почтой без всяких проверок, тупым инсертом добавляется информация об отправляемом письме. При этом, если вдруг письмо с этим MailId по каким-либо причинам уже существует, то оно будет перезаписано новой информацией. Если не верите, то можете сами узреть это в исходниках. Не буду вам мешать в этом увлекательном занятии.

Цитата Pallam ()
Теперь номер два.
INSERT ITEM бла-бла-бла-маил-темлейт (`id`, `bla-bla-bla`) VALUES ((SELECT MAX(`id`) FROM бла-бла-бла-маил-темлейт)+1, 'bla-bla-bla-value');
Фокус понятен?

это не фокус, а необходимость, которая должна быть в ядре, но этого там как раз и нет.

Цитата Pallam ()
И третье.
php
if (server_is_online()) {mail_by_soap(char, item);} else {mail_by_sql(char, item);}

я как раз про это и написал, только не кодом, а словами:
Цитата Кот_ДаWINчи ()
При работе сервера(нужного мира/реалма) такие изменения как отсылка писем с вложенными предметами нужно делать через СОАП и только через СОАП. При отключенном игровом сервере (мире/реалме) Отсылку надо осуществлять уже через базу, так как СОАП не сработает (сервер то отключен). Так что реализовывать надо ОБА способа отсылки.

так что ничего нового вы не сказали.

Цитата Pallam ()
Разжувал все идеально?

Лучше пожуй, точнее погрызи, исходники ядра. Пользы будет больше.

Всего доброго приятно было полемизировать с вами.
мне фиолетово какой у меня рейтинг, можете поставить хоть минус миллион...
Не в плюсах счастье...
Помогаю тем, кто хочет чтобы ему помогли, а не сделали за него.
Сообщение # 12 написано 23.08.2015 в 12:39
Pallam
Рыцарь
Нде, согласен, работа с базой меня серьезно напугала... Привык видеть lock таблиц, во время их работы...
Переписал на нормальную версию.
Однако...
Вся эта полемика была бесполезной. Да и особых знаний для того, что бы сделать отправку предмета почтой на самом то деле нет.
Сообщение # 13 написано 23.08.2015 в 16:31
aveolona
Капрал
Кот_ДаWINчи, благодарю вас за советы, искренне рада, что вы еще посещаете этот форум.
Сообщение # 14 написано 27.08.2015 в 12:55
  • Страница 1 из 1
  • 1
Поиск: