Помощь - Поиск - Пользователи - Календарь
Полная версия: Онлайн Статус Собственными Ручищами
UoKit.com Форумы > Ultima Online : Dev > Sphere Server > Sphere Server 0.56 - Sphere X
Страницы: 1, 2
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 базы аккаунтов перед простой файловой?


Ну это не актуальный вопрос на сегодня smile.gif В данной статье рассматривается конкретно 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"

blink.gif ?
Ozzy Osbourne
Почему то у тебя :
Цитата
<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>

Не отрабатывает. Сделай вот так тогда чисто для проверки:
Цитата
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>,0)""
Mirage
Цитата(Destruction @ 24.10.2010, 18:25) *

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

При всем моем уважении информация совершенно бессмысленна. Я конечно не гений как Шелдон и ТББ но с базами данных имел дело в процессе работы.
Вопрос (на который ответил автор темы, вполне удовлетворив меня своим ответом) возможно был не совсем корректно сформулирован, но был задан к тому что в сфере присутствует создание онлайн статуса штатными средствами. И мне не понятно зачем задействовать средства которые даже вы не в состоянии описать не прибегая к спец литературе. К слову по умолчанию обновление status.html стоит с минутной паузой и не сильно нагружает сервер.

К велосипеду тоже атомный двигатель можно прикрутить и получится нехреновая штука.

А насчет сложностей с установкой апача, php и mysql по-моему это значительно проще сделать имея под рукой информативность интернета чем написать нормальный скрипт для сферы при существующем дефиците хорошей литературы и систематизированных уроков.
Destruction
Я был вежлив.. и буду 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-проектов - с местными нагрузками проблемы не будет.

Еще было бы полезно добавить проверку на доступность удаленного хоста. Помнится на Антаресе не было такой проверки (и там использовался такой же подход, в плане передачи данных между серверами) и выскакивала ошибка с указанием кучи интересной информации.
Ozzy Osbourne
Хватит засорять тему всяким бредом? Ага?

Людей которые заинтересованы в материале читать весь этот бред будет напрягать. Лучше потрать свои силы и блесни знаниями отвечая КОНСТРУКТИВНО людям, которые возможно зададут тут свои вопросы.
Warstone
Мда.. DAMNED KING, ты какой шард держишь-то? Мне просто чтоб туда не попасть ненароком с таким неадекватным стаффом. Дестракшн пока верные замечания давал. Ну и от себя добавлю: Это гораздо медленней решение. Фаил на отдачу закешируется уже конечный, а с ПхП вы каждый раз его будите генерировать. Поэтому ваше решение отъедает заведомо больше ресурсов.
Phistan
DAMNED KING, советую не обращать на них внимания, нервы сохранишь... Ибо бестолковый спор
remiks
Очень полезный материал приношу свою благодарность DAMNED KING. Большое спс......
Mirage
Поправьте меня если я ошибаюсь но мне кажется Destruction и DAMNED KING обсуждая (не будем говорить "споря") обновление статуса говорят о разных вещах и как следствие оба правы и оба ошибаются.
Если задаться целью отображать только количество человек онлайн то более подходит способ предложенный Destruction (записывать изменения при конекте и дисконекте пользователя), если же необходимо динамически отслеживать изменение персонажа на предмет скиллов, убийств, нахождения в гильдии то без передергивания по таймеру не обойтись. Но правильно написанное обновление не приведет к видимым сбоям. В конце концов у нас не миллиарды записей чтобы затормозить сервер уменьшением времени обработки. Ногами только не бейте - я все таки не на том уровне пока что нахожусь чтобы спорить на равных wink.gif


Материал для ознакомления представлен интересный для средней силы скриптера который уже не задает вопроса "а куда сохранять код скрипта O_о" и который может изменить чтото под себя (если не получается написать с 0). Для более углубленного изучения лучше будет воспользоваться технической литературой по языкам программирования, верстке html и php страниц и скульным базам.

PS автору все таки хочется пожелать чуть большей сдержанности. Конечно не приятно когда ктото критикует труд но любая критика имеет право быть - не все могут оптимальный вариант сразу найти. Ктото может посоветовать более простое или (иногда) правильное решение. Тем более что форум и нужен для ОБСУЖДЕНИЯ. А насчет почистить флуд есть модераторы. А так, автор - молоток. Пиши исче.
Ozzy Osbourne
Цитата(Warstone @ 25.10.2010, 11:02) *

Мда.. DAMNED KING, ты какой шард держишь-то? Мне просто чтоб туда не попасть ненароком с таким неадекватным стаффом. Дестракшн пока верные замечания давал. Ну и от себя добавлю: Это гораздо медленней решение. Фаил на отдачу закешируется уже конечный, а с ПхП вы каждый раз его будите генерировать. Поэтому ваше решение отъедает заведомо больше ресурсов.


Я не держу шард, так что не попадешь smile.gif А т.к. стафом я не являюсь, то вполне имею право быть не адекватным (в вашем понимании) 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. Большое спс......


пожалуйста smile.gif

Цитата(Mirage @ 25.10.2010, 15:10) *

...


Да мы с ним просто о разных вещах говорили. В любом случае я его понял, он надеюсь меня тоже.
inkvizitor
Код
MySQL query "INSERT INTO clients VALUES ("0b38c","ololo","0",0,0,0,<FVAL 6103)


Сфера пишет.
Не могу понять почему.

Точнее даже не могу понять откуда он берет значение <FVAL 6103 ошибка точно в нем, но откуда берет его сфера ) не понятно.
Ozzy Osbourne
попробуй так:

Код
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>>)""
Wap
LOL. smile.gif У вас же скобки не хватает:
<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>>
Ozzy Osbourne
Цитата(wap @ 28.3.2011, 12:10) *

LOL. smile.gif У вас же скобки не хватает:
<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>>


Таки да, спс smile.gif
Исправил
inkvizitor
Цитата(wap @ 28.3.2011, 12:10) *

LOL. smile.gif У вас же скобки не хватает:
<FVAL <SERV.Client.<LOCAL.i>.SkillTotal>>


Ага, спасибо. Исправил.
ImProV1zator
а как сюда впихнуть
<FVAL <SERV.Client.<LOCAL.i>.region.name>>
<SERV.Client.<LOCAL.i>.region.name>>
?
13:39:ERROR:MySQL query "INSERT INTO Online VALUES ("09ec8","ImProVizator","0","2874","8151","0","0.1")" failed due to "Duplicate entry '9' for key 1"
ImProV1zator
пробавал вот так
'<SERV.Client.<LOCAL.i>.region.name>'

но если записывается какойнить Nujel'm то вылетает ошибка
Код

21:27:ERROR:MySQL query "INSERT INTO Online(name,guild,karma,fame,kills,location) VALUES('fokuss','0','-90','0','0','Nujel'm')" 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 'm')' at line 1"


если заменить ковычки на ", то

Код

21:31:ERROR:MySQL query "INSERT INTO Online(name,guild,karma,fame,kills,location) VALUES("Smooth Wave","0","0","0","0","Felucca" 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 '"Felucca' at line 1"
ImProV1zator
разобрался
'<db.escapedata <SERV.Client.<LOCAL.i>.region.name>>'
optima171
Ставлю ан 56б под хампп, но выдяёт ошибку когда заливаю


Цитата
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;



Код
#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 ') TYPE=InnoDB DEFAULT CHARSET=utf8' at line 9
WRWR
Код
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;


запятая в конце лишняя была
а так ну карма фэйм килс скилтотал этож не варчар, ну да ладно
Ozzy Osbourne
Угу конечно, был молод и глуп smile.gif

Вобще если бы писал сейчас - координально бы все переделал, но для потомков пригодится и это )
WRWR
только не координально а кардинально smile.gif
fantasyuo
Код
00:03:ERROR:(sphere_serv_triggers.scp,176)Can't resolve <SERV.Client.00.IsOnline>
00:03:ERROR:(sphere_serv_triggers.scp,176)Undefined symbol ''
00:03:ERROR:(sphere_serv_triggers.scp,176)Can't resolve <SERV.Client.0ffffffff.IsOnline>
00:03:ERROR:(sphere_serv_triggers.scp,176)Undefined symbol '

blink.gif
iza chevo error mozet bitj ?
fantasyuo
Цитата(fantasyuo @ 1.12.2014, 2:06) *

Код
00:03:ERROR:(sphere_serv_triggers.scp,176)Can't resolve <SERV.Client.00.IsOnline>
00:03:ERROR:(sphere_serv_triggers.scp,176)Undefined symbol ''
00:03:ERROR:(sphere_serv_triggers.scp,176)Can't resolve <SERV.Client.0ffffffff.IsOnline>
00:03:ERROR:(sphere_serv_triggers.scp,176)Undefined symbol '

blink.gif
iza chevo error mozet bitj ?

UP
Sirocco
Цитата(fantasyuo @ 23.1.2015, 17:11) *

UP

из-за системы счисления, и/или версии сферы.
Llirik
Нет тут походу надо написать что-то типа:

IF <SERV.Clients> // если есть хотя бы 1 игрок на серве!
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
endif

Смысл в том, если нету ни одного игрока на серве, то он не может обработать 0 -1
ImProV1zator
В базу записывает чаров, но из базы php скрипт не достаёт.может я как то криво в html пихаю?
Отображается только списки (никнейм,гильдия,карма и т.д.) но самих показателей нет.
ImProV1zator
Код
<?php
$link = mysqli_connect('localhost', 'impro', 'knock', 'sphere');

if (!$link) {
    echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Соединение с MySQL установлено!" . PHP_EOL;
echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;
?>

<?php
// закрываем соединение с базой
mysql_close($link);
?>


как дальше выветси из базы sphere, clients ?
$yst3m_3rr0r
Давай на PDO перейдем ... более универсальна

1) Создаем сам коннект к сфере - connect.php
Код
<?php

    $host = '127.0.0.1';
    $db   = 'sphere';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';

    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    
    $connection = "mysql:host=$host;dbname=$db;charset=$charset";
    try {
         $pdo = new PDO($connection, $user, $pass, $options);
    } catch (\PDOException $e) {
         throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }

?>


2) Вывод игроков из таблицы client и сортируем их по имени ... лимит сделаем 15 например
Создадим файлик view.php
Код
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Игроки</title>
</head>
<body>
  <table>
  <div>
    <?php
      require ('connect.php');
        
      $number=1;
        
      $statement = $pdo->query("SELECT * FROM `clients` ORDER BY `Name` ASC LIMIT 15");

       while($row = $statement->fetch(PDO::FETCH_ASSOC)) {
         echo "<tr><td>".$number++.". ";
         echo "<strong>".$row['Name']."<strong>";
      }
    ?>
  </div>
  </table>
</body>
</html>



Пробуй, пиши что получилось
ImProV1zator
Код
query("SELECT * FROM `clients` ORDER BY `Name` ASC LIMIT 15"); while($row = $statement->fetch(PDO::FETCH_ASSOC)) { echo "
".$number++.". "; echo "".$row['Name'].""; } ?>


у меня движок сайта на windows-1251 кодировке, не знаю, как поменять.
Aimed
Цитата(ImProV1zator @ 2.11.2019, 1:27) *

Код
query("SELECT * FROM `clients` ORDER BY `Name` ASC LIMIT 15"); while($row = $statement->fetch(PDO::FETCH_ASSOC)) { echo "
".$number++.". "; echo "".$row['Name'].""; } ?>


у меня движок сайта на windows-1251 кодировке, не знаю, как поменять.



Что такое "движок сайта"?
ImProV1zator
Цитата(Aimed @ 3.11.2019, 19:14) *

Что такое "движок сайта"?

CMS (Content Managment System).Система управления сайтом.

Да уже поменял на стандартный Html в кодировке Utf8...
ImProV1zator
На Html таже самая ошибка...
Juzzver
Цитата
у меня движок сайта на windows-1251 кодировке, не знаю, как поменять.

И чем это тебе мешает?
Цитата
На Html таже самая ошибка...

В phpMyAdmin зайди на сайте и там выставь нужную тебе кодировку.
ImProV1zator
На Dle не меняется кодировка,если ее поменять то вся админ панель и сайт будут в вопросиках.Я уже сменил сайт, всё норм =)
Только вот статус не выводится все равно.
Aimed
Т.е. база данных это теперь движок сайта?))))
А какая ошибка в html была? В cp1251 все должно работать, хоть это и является плохой практикой. Лучше везде utf8 использовать. И главное чот б веб сервер в хедере другую кодировку на слал, которая отличается от той что в html прописана.
ImProV1zator
Help
не отображает статус
база sphere, подбаза clients
uid name karma fame kills skilltotal
ImProV1zator
Может надо что то в .htacces прописать, чтобы php включилось?
ImProV1zator
Сделал сортировку по именам, но таблица сбивается если добавить вторую колонку гильдий, то переходит на новую строку.
помогите оформить под таблицу
Код
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Freedom Server Status</title>

    <link rel="stylesheet" type="text/css" href="css/css.css">

</head>

<body>
<table>
<tr>
<TH>Имя</TH>
<TH>Гильдия</TH>
<TH>Карма</TH>
<TH>Известность</TH>
<TH>Убийства</TH>
<TH>Навыки</TH>
<tr><td><?php
      require ('connect.php');
        
      $number=1;
        
      $statement = $pdo->query("SELECT * FROM `clients` ORDER BY `Name` ASC LIMIT 15");

       while($row = $statement->fetch(PDO::FETCH_ASSOC)) {
         echo "<tr><td>".$number++.". ";
         echo "<strong>".$row['name']."<strong>";    
         echo "</td></tr>";        
      }

?><td><?php
      require ('connect.php');
        
      $number=1;
        
      $statement = $pdo->query("SELECT * FROM `clients` ORDER BY `Name` ASC LIMIT 15");

       while($row = $statement->fetch(PDO::FETCH_ASSOC)) {
         echo "<td>".$number++.". ";
         echo "<strong>".$row['ABBREV']."<strong>";    
         echo "</td>";        
      }

?></td><td>3</td><td>4</td><td>5</td></tr>

</table>

    <script type="text/javascript" src="js/js.js"></script>
Aimed
Цитата(ImProV1zator @ 6.11.2019, 14:36) *

Код
1.
Notice: Undefined index: Name in /home/bhx20369/public_html/status_online.php on line 21
2.
Notice: Undefined index: Name in /home/bhx20369/public_html/status_online.php on line 21
3.
Notice: Undefined index: Name in /home/bhx20369/public_html/status_online.php on line 21
mysqli_close($link); ?>



А ты читаешь что написано в сообщении? Там номер строки в файле status_online.php указывается. Этот файл с кодом ты сюда не выложил и каким образом тут тебе помогать?
Aimed
Нажмите для просмотра прикрепленного файла

бл** зачем редактировать сообщение...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.