|
|
|
Онлайн Статус Собственными Ручищами |
|
|
Ozzy Osbourne |
23.10.2010, 21:09
|
Grandmaster
Сообщений: 2.068
Регистрация: 5.8.2003 Группа: Пользователи Наличность: 0
Пользователь №: 810
Возраст: 32
|
В связи с тем что вопрос создания статуса для сервера на сегодняшний день актуальный и в личку мне пришло пару сообщений по этому поводу - я расскажу вам как его создать своими ручищами при помощи mysql+php и чашки чаяВ данном уроке мы будем рассматривать ситуацию когда сфера (у меня 56b), mysql и apache находятся на одной машине (сервере). Такой подход сильнее грузит сферу, но более понятен на старте новичкам. В качестве сервера может выступать: ваш домашний компьютер, выделенный сервер (ddc) либо виртуальный сервер (vds/vps). - Для начала установим 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”.
(IMG:http://automum.od.ua/uosoft/1.jpg)
Открываем браузер, вводим http://localhost/ в поле адреса, если на экране видим приветствие от xampp - значит пока что вы все сделали правильно.
- Теперь когда mysql и apache мы установили, следует научить сферу работать с базой. Для этого открываем sphere.ini и находим (или добавляем) следующий текст:
Цитата // MySql configuration. MYSQL=1 MySqlHost=localhost MySqlUser=root MySqlPassword= MySqlDatabase=sphere
По умолчанию пользователь базы данных root с пустым паролем. В качестве названия базы данных я выбрал sphere, её мы создадим позже.
Теперь запускаем сферу (spheresrv.exe). Если в логе сферы не видим ошибку ”MySQL connect fail” - значит подключение к базе прошло успешно. Закрываем сферу, она нам пока не нужна.
- В папке 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 и обновлять в базе текущих пользователей онлайн. Дурные идеи типа живого статуса обновляющегося без задержки - выкиньте нафиг, это сильно убьет вашу базу. Если напрягает пять минут - поставьте одну, но при большом онлайне это будет грузить базу и сервер в целом
- Теперь нам понадобится создать эту самую базу ”sphere” и таблицу ”clients”. Запускаем с рабочего стола ярлычек ”Xampp Control panel” и нажимаем кнопку ”admin” рядом с ”mysql”. Нам открываем популярный инструмент для работы с базами - phpmyadmin
(IMG:http://automum.od.ua/uosoft/2.jpg)
Вводим название новой базы данных, а рядом обязательно указываем кодировку полей ”utf8_general_ci” (мы же умные люди и используем только utf8!) и нажимаем ”создать”.
(IMG:http://automum.od.ua/uosoft/3.jpg)
База создалась и появилась в левом меню. Кликаем по названию ”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” (в левой части страницы), а затем на кнопочку ”обзор” - в правой верхней части страницы.
(IMG:http://automum.od.ua/uosoft/5.jpg)
(IMG:http://automum.od.ua/uosoft/6.jpg)
Если все окей и данные в базу добавились - тогда вы их сразу там и увидите:
(IMG:http://automum.od.ua/uosoft/4.jpg)
Если данные есть (т.е. инфа по тем юзерам что были онлайн) - тогда у нас все получилось. Сфера работает, база работает, в базу юзеры добавляются - значит осталось дело за маленьким, выводить информацию на вашем сайте.
- В нашем случае ваш сайт это 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> - и вуаля, статистика прямо у вас на экране.
(IMG:http://automum.od.ua/uosoft/7.jpg)
Вы наверное ждали статистику в красивой зеленой табличке, а получили просто данные на экран. Но ведь это самое главное! Теперь вы умеете доставать данные с базы, а оформить их по своему это 10 минут времени и знания хотя бы 1й главы html учебника. Лень? Окей, немного передохну и опубликую в этой статье пример файла index.php с оформлением данных в виде таблицы.
А вот если статистики совсем нет - тогда читаем ответ ниже.
--------------------
|
|
|
|
Ozzy Osbourne |
23.10.2010, 21:21
|
Grandmaster
Сообщений: 2.068
Регистрация: 5.8.2003 Группа: Пользователи Наличность: 0
Пользователь №: 810
Возраст: 32
|
Вопрос: Открываю 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 удаленно - значит будет работать
--------------------
|
|
|
|
Destruction |
24.10.2010, 17:25
|
Группа: Администраторы Наличность: 0
Пользователь №: 1.833
|
Цитата В данном уроке мы будем рассматривать ситуацию когда сфера (у меня 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
--------------------
Discord: tatikom
|
|
|
|
Soteric |
24.10.2010, 18:36
|
Master
Сообщений: 1.377
Регистрация: 7.8.2006 Группа: Пользователи Наличность: 2160
Пользователь №: 7.166
|
Цитата 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 |
24.10.2010, 18:45
|
Grandmaster
Сообщений: 2.068
Регистрация: 5.8.2003 Группа: Пользователи Наличность: 0
Пользователь №: 810
Возраст: 32
|
to DestructionОх как я не люблю этот бредовый флуд лишь бы выпендриться что "я тоже что то знаю". Ну ладно, отвечу вам на сообщение и надеюсь на этом засорение темы прекратится.Вывод статус сервера из базы на стороннем хостинге - дело может быть очень геморройным. По умолчанию на серверах закрывают удаленное использование БД и было бы куча текса "как открыть mysql для сторонних подключений", а в целях безопасности еще и объяснять как открывать конкретно для IP своего хостинга что б не начали пресенговать базу лишними подключениями. Мне кажется подход все на одном сервере для новичков намного понятнее и удобнее. Считаешь иначе? Считай дальше.. А теперь по тексту: Цитата Нагрузка будет выше на сам сервер, а сфера может из-за этого тормозить, если на сервере недостаточно ресурсов. А я что не так написал? Или мне нужно было уточнять ЧТО КОНКРЕТНО будет тормозить НА сервере или это имеет такую важную роль?! Мой урок не для даунов, а для новичков. Поэтому считаю разумным не объяснять что когда тормозит сервер из-за нехватки ресурсов - сфера тоже будет тормозить. Цитата Т.е. для изучения вашего урока - человеку придется установить и настроить для поддержки PHP свой веб-сервер, что несколько излишне (а описание этой процедуры все-таки не имеет отношения непосредственно к этому уроку). Для изучения моего урока человек не отходя от собственного домашнего компа где у него стоит сфера - качает xampp и поднимает веб-сервер за два клика. Хочешь рассказать как поднимать мускул на винде без веб-сервера, а потом настраивать сторонний софт для работы с базой - валяй, я использую для этого свой подход. А уж если закрыто удаленное подключение, то с базой работать только через "удаленный рабочий стол+сторонни_софт" что весьма не удобно. Я некому ничего не навязываю, я рассказываю свой подход если это еще не понятно. Хочешь рассказать другой подход - в виде отдельного урока. Цитата Не согласен. Обновлять данные можно (я надеюсь можно?) когда персонаж входит/выходит из игры.Обновление по первичному ключу базы в 100 тыс. записей будет занимать доли секунды и с базой ничего не сделает. Можно. А нужно ли? Лично я использую кеширование данных на 5 минут и делаю выборку данных с базы не каждое обновление страницы. В вашем случае селект к базе будем делать каждый рефреш страницы. А стоит ли этого того? Мне кажется лишнее, достаточно "живого" статуса онлайн внутри игры. Цитата Не DELETE, а TRUNCATE. Делит понятнее для новичков. Учитывая что работают два подхода, я выбрал тот что понятнее для прочтения кода. to KanibalУгу, там лишняя запятая. Soteric правильно заметил. to allотредактируйте плиз свои сообщения что б вместо <code> было <quote>, то тема поползла(
--------------------
|
|
|
|
Destruction |
24.10.2010, 23:02
|
Группа: Администраторы Наличность: 0
Пользователь №: 1.833
|
Я был вежлив.. и буду (IMG: style_emoticons/default/smile.gif) В ответ на твое мнение о моем комментарии - поделюсь своим мнением о твоем: нужно спокойнее относится к критике. Цитата А я что не так написал? Или мне нужно было уточнять ЧТО КОНКРЕТНО будет тормозить НА сервере или это имеет такую важную роль?! Мой урок не для даунов, а для новичков. Поэтому считаю разумным не объяснять что когда тормозит сервер из-за нехватки ресурсов - сфера тоже будет тормозить. Ты перепутал причину и следствие - ты написал, что тормозить будет сфера. Я могу понять неточные выражения с целью упрощения понимания, но здесь такого не наблюдается. Цитата Для изучения моего урока человек не отходя от собственного домашнего компа где у него стоит сфера - качает xampp и поднимает веб-сервер за два клика. Хочешь рассказать как поднимать мускул на винде без веб-сервера, а потом настраивать сторонний софт для работы с базой - валяй, я использую для этого свой подход. А уж если закрыто удаленное подключение, то с базой работать только через "удаленный рабочий стол+сторонни_софт" что весьма не удобно. Я некому ничего не навязываю, я рассказываю свой подход если это еще не понятно. Хочешь рассказать другой подход - в виде отдельного урока. А я лишь делюсь своим мнением, чтобы ваше не было единственно верным. Зачем в штыки-то ? Цитата Можно. А нужно ли? Лично я использую кеширование данных на 5 минут и делаю выборку данных с базы не каждое обновление страницы. В вашем случае селект к базе будем делать каждый рефреш страницы. А стоит ли этого того? Мне кажется лишнее, достаточно "живого" статуса онлайн внутри игры. Вы не уловили суть. Еще раз вас процитирую: >>Дурные идеи типа живого статуса обновляющегося без задержки - выкиньте нафиг, это сильно убьет вашу базу. Это бред. Так яснее, что я хотел сказать? Цитата Делит понятнее для новичков. Учитывая что работают два подхода, я выбрал тот что понятнее для прочтения кода. Есть принципиальная разница между двумя командами. Еще понятнее будет - если выбрать все записи и по одной их удалять, чтобы в таблице совсем-совсем ничего не осталось, но что-то я не вижу активистов использовать такой способ (вернее один раз встретился, поэтому и припомнил). Да и насчет понятнее - сомнительно, так ли понятнее использовать неправильную команду? http://dev.mysql.com/doc/refman/5.0/en/truncate-table.htmlПочитайте, узнаете новую для себя команду. Mirage, когда я отвечал - я видимо не заметил его ответ. В любом случае - все то, что написал автор вы можете найти самостоятельно в интернете и даже больше, что я собственно говоря и посоветовал. Мне даже будет не лень заглянуть в гугл и привести из него цитаты соответствующие каждому пункту, который указал автор. Нужно? Добавлено:Вы, кстати, не там ставите кэширование. Запись в локальную СуБД, раз уж вы её используете - операция слабо напряжная. А вот дергать каждый раз сервер спрашивая с него данные - весьма затратно. Соответственно - там кэширование можете убрать и сделать обновление по заходу/выходу, нагрузки это не даст. А вот где данные берутся: Код $cache_file = "accounts.info"; // файл кэша $cache_time = 5*60; // время кэширования - 5 минут if( ! is_readable( $cache_file ) || time() - $cache_time > filemtime( $cache_file ) ){ $content = file_get_contents("http://ваш_реальный_ip_сервера/"); file_put_contents( $cache_file, $content ); } else{ $content = file_get_contents( $cache_file ); } Тут может быть проблемка, в случае двух параллельных запросов.. Но это уже отдельная тема про кэш для highload-проектов - с местными нагрузками проблемы не будет. Еще было бы полезно добавить проверку на доступность удаленного хоста. Помнится на Антаресе не было такой проверки (и там использовался такой же подход, в плане передачи данных между серверами) и выскакивала ошибка с указанием кучи интересной информации.
--------------------
Discord: tatikom
|
|
|
|
Ozzy Osbourne |
25.10.2010, 15:28
|
Grandmaster
Сообщений: 2.068
Регистрация: 5.8.2003 Группа: Пользователи Наличность: 0
Пользователь №: 810
Возраст: 32
|
Цитата(Warstone @ 25.10.2010, 11:02) Мда.. DAMNED KING, ты какой шард держишь-то? Мне просто чтоб туда не попасть ненароком с таким неадекватным стаффом. Дестракшн пока верные замечания давал. Ну и от себя добавлю: Это гораздо медленней решение. Фаил на отдачу закешируется уже конечный, а с ПхП вы каждый раз его будите генерировать. Поэтому ваше решение отъедает заведомо больше ресурсов.
Я не держу шард, так что не попадешь (IMG: style_emoticons/default/smile.gif) А т.к. стафом я не являюсь, то вполне имею право быть не адекватным (в вашем понимании) (IMG: style_emoticons/default/biggrin.gif) С Дистракшином мы уже все обсудили, он не понял меня, я не понял его. В данном примере не идет разговор про оптимизацию и как это все дело можно сделать лучше. Я говорил про то что если использовать mysql рядом с сферовым сервером, а хостинг - на другом сервере : тогда сталкнемся с кое какой проблемой. При заходе на страницу статистики будет происходить коннект у удаленному серверу mysql для выборки данных что достаточно медленно (как минимум 1-2 сек при хорошем коннекте, а то и больше), а потом еще время на обработку данных и её вывод. Что бы такого не происходило я и предложил кеширование данных каждые 5 минут, что б не подключатся к удаленной БД каждое обновление странички статуса, а брать данные с кеша. При работе с кешем в данном случае скорость будет на порядок выше, а нагрузка на базу на несколько порядков ниже т.к. будет идти только 1 выборка в течении 5 минут, а не столько раз сколько обновлена страница. Вот собственно это была одна из причин спора которую мы уже решили в личке. Если вы считаете что кеширование в описанном мною способе лишнее и есть более быстрые способы - готов вас выслушать. Цитата(Phistan @ 25.10.2010, 11:22) DAMNED KING, советую не обращать на них внимания, нервы сохранишь... Ибо бестолковый спор
ага, спс. самому не нравится засырание темы всякими "у кого яйца круче" Цитата(remiks @ 25.10.2010, 14:24) Очень полезный материал приношу свою благодарность DAMNED KING. Большое спс......
пожалуйста (IMG: style_emoticons/default/smile.gif) Цитата(Mirage @ 25.10.2010, 15:10) ...
Да мы с ним просто о разных вещах говорили. В любом случае я его понял, он надеюсь меня тоже.
--------------------
|
|
|
|
inkvizitor |
28.3.2011, 11:18
|
Registred
Сообщений: 7
Регистрация: 2.3.2004 Группа: Пользователи Наличность: 0
Пользователь №: 1.607
|
Код MySQL query "INSERT INTO clients VALUES ("0b38c","ololo","0",0,0,0,<FVAL 6103) Сфера пишет. Не могу понять почему. Точнее даже не могу понять откуда он берет значение <FVAL 6103 ошибка точно в нем, но откуда берет его сфера ) не понятно.
--------------------
I am go'in script
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|