UoKit.com Форумы > Ultima Online : Dev > Sphere Server > Sphere Server 0.56 - Sphere X
Страницы: 1, 2, 3, 4, 5, 6, 7
Ozzy Osbourne
В связи с тем что вопрос создания статуса для сервера на сегодняшний день актуальный и в личку мне пришло пару сообщений по этому поводу - я расскажу вам как его создать своими ручищами при помощи mysql+php и чашки чая

В данном уроке мы будем рассматривать ситуацию когда сфера (у меня 56b), mysql и apache находятся на одной машине (сервере). Такой подход сильнее грузит сферу, но более понятен на старте новичкам.

В качестве сервера может выступать: ваш домашний компьютер, выделенный сервер (ddc) либо виртуальный сервер (vds/vps).
  1. Для начала установим apache+mysql на машину. Для этого мы будем использовать многофункциональный набор xampp (apache+mysql+php+perl). При его установке на нашу машину сразу станет нужный нам апач и mysql. Почитать подробнее можно на вики (http://ru.wikipedia.org/wiki/XAMPP)

    Заходим на официальный сайт в раздел Windows (http://www.apachefriends.org/en/xampp-windows.html) и качаем XAMPP Windows [EXE]

    После того как скачали - открываем и устанавливаем, к примеру на C:\xampp

    На рабочем столе находим ярлычек ”XAMPP Control Panel” и запускаем. Он нам открываем xampp панельку. Тыкаем на кнопку ”start” возле ”apache” и ”mysql”. Спустя пару секунд службы стартанут, а рядом станут активны кнопки ”admin”.



    Открываем браузер, вводим http://localhost/ в поле адреса, если на экране видим приветствие от xampp - значит пока что вы все сделали правильно.

  2. Теперь когда mysql и apache мы установили, следует научить сферу работать с базой. Для этого открываем sphere.ini и находим (или добавляем) следующий текст:

    Цитата
    // MySql configuration.
    MYSQL=1
    MySqlHost=localhost
    MySqlUser=root
    MySqlPassword=
    MySqlDatabase=sphere


    По умолчанию пользователь базы данных root с пустым паролем. В качестве названия базы данных я выбрал sphere, её мы создадим позже.

    Теперь запускаем сферу (spheresrv.exe). Если в логе сферы не видим ошибку ”MySQL connect fail” - значит подключение к базе прошло успешно. Закрываем сферу, она нам пока не нужна.

  3. В папке scripts находим файл sphere_serv_triggers.scp и открываем его блокнотом к примеру. Находим в нем функцию ”f_onserver_timer” и добавляем в конец:

    Цитата
    IF (<DB.Connected>==0)
    DB.Connect
    DB.Query "SET NAMES utf8"
    DB.Query "SET CHARACTER SET utf8"
    DB.Query "SET character_set_client='utf8'"
    DB.Query "SET character_set_connection='utf8'"
    DB.Query "SET character_set_results='utf8'"
    RETURN 0
    ENDIF

    DB.Execute "DELETE FROM clients"
    FOR i 0 <EVAL (<SERV.Clients>-1)>
    IF (<SERV.Client.<LOCAL.i>.IsOnline>==1)
    DB.Execute "INSERT INTO clients VALUES ("<SERV.Client.<LOCAL.i>.UID>","<SERV.Client.<LOCAL.i>.Name>","<SERV.Client.<LOCAL.i>.MEMORYFINDTYPE.memory_guild.LINK.ABBREV>",<SERV.Client.<LOCAL.i>.Karma>,<SERV.Client.<LOCAL.i>.Fame>,<SERV.Client.<LOCAL.i>.Kills>,<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>>)""
    ENDIF
    ENDFOR


    Если функцию f_onserver_timer не нашли - ничего страшного, создайте её [FUNCTION f_onserver_timer] в конце файла (перед [eof]) и добавьте тот код что я написал выше.

    В двух словах расскажу что мы сделали. Мы определили функцию f_onserver_timer которая автоматически запускается сферой каждые N минут и проводит указанные действия. В данном случае функция проверяет есть ли подключение к базе, если есть: а) очищает таблицу clients. б) добавляет всех пользователей что сейчас онлайн в таблицу clients

    По умолчанию запуск f_onserver_timer в сфере отключен, поэтому открываем sphere.ini и находим:

    Цитата
    // Amount of minutes to call f_onserver_timer (0 disables this, default)
    TimerCall=0


    Я устанавливаю значение в 5 минут:

    Цитата
    // Amount of minutes to call f_onserver_timer (0 disables this, default)
    TimerCall=5


    Это означает что каждые 5 минут будет запускатся функция f_onserver_timer и обновлять в базе текущих пользователей онлайн. Дурные идеи типа живого статуса обновляющегося без задержки - выкиньте нафиг, это сильно убьет вашу базу. Если напрягает пять минут - поставьте одну, но при большом онлайне это будет грузить базу и сервер в целом

  4. Теперь нам понадобится создать эту самую базу ”sphere” и таблицу ”clients”. Запускаем с рабочего стола ярлычек ”Xampp Control panel” и нажимаем кнопку ”admin” рядом с ”mysql”. Нам открываем популярный инструмент для работы с базами - phpmyadmin



    Вводим название новой базы данных, а рядом обязательно указываем кодировку полей ”utf8_general_ci” (мы же умные люди и используем только utf8!) и нажимаем ”создать”.



    База создалась и появилась в левом меню. Кликаем по названию ”sphere (0)” и нам открывается страница таблиц этой базы. Естественно таблиц у нас там не каких еще нету. Так как у нас урок для новичков, рассказывать как в ручную создавать поля для таблицы и тп я не буду (хотя это достаточно просто), поэтому просто нажимайте кнопку ”SQL” в менюшке вверху и в появившемся окошке вводите следующий код:

    Цитата
    CREATE TABLE IF NOT EXISTS `clients` (
    `uid` varchar(255) NOT NULL,
    `name` varchar(255) NOT NULL,
    `ABBREV` varchar(255) NOT NULL,
    `karma` varchar(255) NOT NULL,
    `fame` varchar(255) NOT NULL,
    `kills` varchar(255) NOT NULL,
    `SkillTotal` varchar(255) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    Нажимаем ОК и наша таблица создана.

    Запускаем нашу сферу, конектимся к ней хотя бы одним чаром и идем курить на указанный ”TimerCall” минут. Только окошко с phpmyadmin не закрывайте, еще понадобится.

    Когда указанное время истекло и функция добавление чаров в базу уже отработала - открываем нами любимый phpmyadmin и тыкаем на название таблицы ”clients” (в левой части страницы), а затем на кнопочку ”обзор” - в правой верхней части страницы.





    Если все окей и данные в базу добавились - тогда вы их сразу там и увидите:



    Если данные есть (т.е. инфа по тем юзерам что были онлайн) - тогда у нас все получилось. Сфера работает, база работает, в базу юзеры добавляются - значит осталось дело за маленьким, выводить информацию на вашем сайте.

  5. В нашем случае ваш сайт это http://localhost/ (локальный) или <a href=\"http://ваш_реальный_ip\" target=\"_blank\"><a href="http://ваш_реальный_ip" target="_blank">http://ваш_реальный_ip</a></a> (доступный для всех юзеров интернета). Открываем папку где устанавливали xampp (C:\xampp ?), открываем там папку htdocs и удаляем все что там внутри.

    Создаем файлик index.php следующего содержания:

    Цитата
    <?php
    // тут я указал наши данные для подключения к mysql
    $link = mysql_connect('127.0.0.1', 'root', '');
    if (!$link) {
    die('Could not connect: ' . mysql_error());
    }
    // название нашей базы
    mysql_select_db("sphere");
    // далем запроса в базу на получение всех пользователей
    $result = mysql_query("SELECT * FROM `clients` WHERE 1");
    // тег pre - для красивого вывода
    echo '<h1>Статистика</h1><pre>';
    // пробегаем по полученному массиву где $row это текущий пользователь
    while ($row = mysql_fetch_assoc($result)) {
    // выводим данные пользователя на экран
    print_r($row);
    }
    // закрываем тег
    echo '</pre>';
    // закрываем соединение с базой
    mysql_close($link);


    Теперь открываем браузер, вводим <a href="http://ваш_реальный_ip" target="_blank"><a href="http://ваш_реальный_ip" target="_blank">http://ваш_реальный_ip</a></a> - и вуаля, статистика прямо у вас на экране.



    Вы наверное ждали статистику в красивой зеленой табличке, а получили просто данные на экран. Но ведь это самое главное! Теперь вы умеете доставать данные с базы, а оформить их по своему это 10 минут времени и знания хотя бы 1й главы html учебника. Лень? Окей, немного передохну и опубликую в этой статье пример файла index.php с оформлением данных в виде таблицы.

    А вот если статистики совсем нет - тогда читаем ответ ниже.

Вверх
Ozzy Osbourne
Вопрос: Открываю http://мой_реальный_ип/ и вижу только слово "Статистика"! В чем проблема???
Ответ: Скорее всего у вас нет данных в базе. Такое может произойти если чаров нету онлайн, или вы вошли чаром после того как функция сбора статистики - отработала. Подождите минут 5 и посмотрите


Вопрос: Как поставить пароль на root пользователя mysql?
Ответ: Через phpmyadmin, вкладка "привилегии".


Вопрос: Открываю http://мой_реальный_ип/ и пишет сервер не найден
Ответ: Скорее всего вы подключаетесь к интернету через роутер (тобиш свич). Для этого в настройках роутера найдите "Port Forwarding" (перенаправление портов) и перенаправляйте 80й порт вашего свича на 80й порт вашего компа


Вопрос: http://localhost/ работает, а http://мой_реальный_ип/ - нет. Почему?
Ответ: Смотри ответ выше


Вопрос: У меня сайт находится на другом хостинге, не там где сервер. Как мне на сайте вывести данные из http://мой_реальный_ип_сервера/ ???
Ответ: Самый простой способ:
На своем хостинге создайте файл statistic.php, откройте его и введите:
Цитата
<?php
// For PHP 5 and up
$handle = fopen("http://ваш_реальный_ип_сервера/", "rb");
$contents = stream_get_contents($handle);
fclose($handle);

ну и оформляйте все это дело в дизайн вашего сайта.

Второй вариант - перекопировать файл index.php из этого урока к вам на хостинг (предварительно переименовав). И изменить настройки подключения к базе с localhost, на ваш_реальный_ип_сервера. Если на сервере разрешено использовать mysql удаленно - значит будет работать
Вверх
Ozzy Osbourne
Для вывода статуса в виде таблички - немного меняем наш index.php:

Цитата
<?php
// тут я указал наши данные для подключения к mysql
$link = mysql_connect('195.234.5.208', 'sphere', 'qJYyFx74RSFpWCcd');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
// название нашей базы
mysql_select_db("sphere");
// далем запроса в базу на получение всех пользователей
$result = mysql_query("SELECT * FROM `clients` WHERE 1");
// тег pre - для красивого вывода
?>
<table border="1" width="500">
<tr>
<td><b>Логин</b>
<td><b>Гильда</b>
<td><b>Карма</b>
<td><b>Фама</b>
<td><b>Убийства</b>
<td><b>Сум.скилл</b>
<?php
// пробегаем по полученному массиву где $row это текущий пользователь
while ($row = mysql_fetch_assoc($result)) {
// выводим данные пользователя на экран
?>
<tr>
<td><?php echo $row['name']?>
<td><?php echo $row['ABBREV']?>
<td><?php echo $row['karma']?>
<td><?php echo $row['fame']?>
<td><?php echo $row['kills']?>
<td><?php echo $row['SkillTotal']?>
<?php
}
?>
</table>
<?php
// закрываем соединение с базой
mysql_close($link);



Вверх
Mirage
Тема нормальная.
Только хотелось бы узнать в чем существенные преимущества mysql базы аккаунтов перед простой файловой?

PS очень бы неплохо было прикрепить подробное описание регистрации с сайта в mysql базу с последующим задействованием в игре. Либо вариант применяемый на некоторых серверах - связка аккаунта на сайте (форуме) с аккаунтом в игре. Оно конечно на любителя но в целях образования интересно.
Вверх
Ozzy Osbourne
Цитата(Mirage @ 24.10.2010, 16:14)

Только хотелось бы узнать в чем существенные преимущества mysql базы аккаунтов перед простой файловой?


Ну это не актуальный вопрос на сегодня В данной статье рассматривается конкретно mysql статистика по сравнению со стандартной, вот её приемущества
  1. Мы не нагружаем файловую систему сервера
  2. Возможность расширеной лог системы кто когда входил, сколько времени был онлайн и тп
  3. Возможность организовать полное отслеживание у какого чара на сколько вырос скил за день, появилось золота, прокачался лвл и тп
  4. Использование графиков при выводе статистики
  5. И куча, куча другого
Тут все зависит от фантазии и навыков разработчика.

Цитата(Mirage @ 24.10.2010, 16:14)
PS очень бы неплохо было прикрепить подробное описание регистрации с сайта в mysql базу с последующим задействованием в игре. Либо вариант применяемый на некоторых серверах - связка аккаунта на сайте (форуме) с аккаунтом в игре. Оно конечно на любителя но в целях образования интересно.


вопрос регистрации через mysql это уже тема другой темы, которую я кстати уже частично описал вот тут - https://forum.uokit.com/index.php?showt...19112&st=20
Вверх
Destruction
Цитата
В данном уроке мы будем рассматривать ситуацию когда сфера (у меня 56b), mysql и apache находятся на одной машине (сервере). Такой подход сильнее грузит сферу, но более понятен на старте новичкам.

Позволю себе не согласиться. Нагрузка будет выше на сам сервер, а сфера может из-за этого тормозить, если на сервере недостаточно ресурсов.
Да и вопрос понимания - штука сложная. Обычно сайт, на котором нужно отображать статус - находится на отдельном хостинге, за который платят 100р/месяц.
Т.е. для изучения вашего урока - человеку придется установить и настроить для поддержки PHP свой веб-сервер, что несколько излишне (а описание этой процедуры все-таки не имеет отношения непосредственно к этому уроку).

Цитата
Это означает что каждые 5 минут будет запускатся функция f_onserver_timer и обновлять в базе текущих пользователей онлайн. Дурные идеи типа живого статуса обновляющегося без задержки - выкиньте нафиг, это сильно убьет вашу базу. Если напрягает пять минут - поставьте одну, но при большом онлайне это будет грузить базу и сервер в целом

Не согласен. Обновлять данные можно (я надеюсь можно?) когда персонаж входит/выходит из игры.
Обновление по первичному ключу базы в 100 тыс. записей будет занимать доли секунды и с базой ничего не сделает.

Цитата
DB.Execute "DELETE FROM clients"

Не DELETE, а TRUNCATE.

PS: Я лишь бегло пробежался по вашему уроку с целью выразить свое мнение, как веб-разработчика.


Цитата(Mirage @ 24.10.2010, 17:14)
хотелось бы узнать в чем существенные преимущества mysql базы аккаунтов перед простой файловой?

MySQL хранит данные в файлах, если вы не знали.

В чем преимущество? - В том, что это специально предназначенный продукт реализующий большинство преимуществ реляционной СуБД.

О реляционных СуБД и их преимуществах можете почитать в интернете, в частности на mysql.com
Вверх
Kanibal
Постоянно выскакивает вот это:
Цитата

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE=InnoDB DEFAULT CHARSET=utf8' at line 9

Вверх
Soteric
Цитата
CREATE TABLE IF NOT EXISTS `clients` (
`uid` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`ABBREV` varchar(255) NOT NULL,
`karma` varchar(255) NOT NULL,
`fame` varchar(255) NOT NULL,
`kills` varchar(255) NOT NULL,
`SkillTotal` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Наверное запятая здесь на конце не нужна
Цитата
`SkillTotal` varchar(255) NOT NULL,

--
Цитата
$result = mysql_query("SELECT * FROM `clients` WHERE 1");

А это зачем?
Вверх
Ozzy Osbourne
to Destruction

Ох как я не люблю этот бредовый флуд лишь бы выпендриться что "я тоже что то знаю". Ну ладно, отвечу вам на сообщение и надеюсь на этом засорение темы прекратится.

Вывод статус сервера из базы на стороннем хостинге - дело может быть очень геморройным. По умолчанию на серверах закрывают удаленное использование БД и было бы куча текса "как открыть mysql для сторонних подключений", а в целях безопасности еще и объяснять как открывать конкретно для IP своего хостинга что б не начали пресенговать базу лишними подключениями. Мне кажется подход все на одном сервере для новичков намного понятнее и удобнее. Считаешь иначе? Считай дальше..

А теперь по тексту:

Цитата
Нагрузка будет выше на сам сервер, а сфера может из-за этого тормозить, если на сервере недостаточно ресурсов.


А я что не так написал? Или мне нужно было уточнять ЧТО КОНКРЕТНО будет тормозить НА сервере или это имеет такую важную роль?! Мой урок не для даунов, а для новичков. Поэтому считаю разумным не объяснять что когда тормозит сервер из-за нехватки ресурсов - сфера тоже будет тормозить.

Цитата
Т.е. для изучения вашего урока - человеку придется установить и настроить для поддержки PHP свой веб-сервер, что несколько излишне (а описание этой процедуры все-таки не имеет отношения непосредственно к этому уроку).


Для изучения моего урока человек не отходя от собственного домашнего компа где у него стоит сфера - качает xampp и поднимает веб-сервер за два клика. Хочешь рассказать как поднимать мускул на винде без веб-сервера, а потом настраивать сторонний софт для работы с базой - валяй, я использую для этого свой подход. А уж если закрыто удаленное подключение, то с базой работать только через "удаленный рабочий стол+сторонни_софт" что весьма не удобно. Я некому ничего не навязываю, я рассказываю свой подход если это еще не понятно. Хочешь рассказать другой подход - в виде отдельного урока.

Цитата
Не согласен. Обновлять данные можно (я надеюсь можно?) когда персонаж входит/выходит из игры.Обновление по первичному ключу базы в 100 тыс. записей будет занимать доли секунды и с базой ничего не сделает.


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

Цитата
Не DELETE, а TRUNCATE.


Делит понятнее для новичков. Учитывая что работают два подхода, я выбрал тот что понятнее для прочтения кода.



to Kanibal
Угу, там лишняя запятая. Soteric правильно заметил.


to all
отредактируйте плиз свои сообщения что б вместо <code> было <quote>, то тема поползла(
Вверх
Kanibal
А это пчему выскакивает:
Цитата

MySQL query "INSERT INTO clients VALUES ("06260","Kanibal","0",1272,10000,0,)" failed due to "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"

?
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.