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

Мануал [WEB] Вывод онлайне с сервера на сайте или форуме.

Desquire

Гений мысли
Партнер
Победитель в номинации 2023
Победитель в номинации 2021
Победитель в номинации 2019
Преподаватель
За заслуги перед форумом
Старожил I степени
Медаль Благодарности
Мастер реакций
Любитель реакций
За веру и верность форуму
Победитель в номинации 2016
Победитель в номинации 2015
Web разработчик
Сообщения
1 808
Розыгрыши
11
Репутация
1 389
Реакции
1 314
Баллы
1 808
Меня довольно часто спрашивают как вывести онлайн на форуме или на промо странице.
Брать за это деньги уже не позволяет совесть, поэтому специально для mmo-develop.ru набросал этот мануал.

В статье будет предложено несколько вариантов вывода:
как и в % от максимального онлайна ( что сейчас можно);
с накруткой ( как раньше ).

Для начала нам понадобится пхп скрипт, который и будет выводить или онлайн или %.
С него и начнем.
Выкладываю готовый код, ниже будет пояснения.
PHP:
<?php

/**
* Description of online
*
* @author Anton Faibyshev
* email: faibyshevao@gmail.com
* skype: zGrandy
* Специально для mmo-develop.ru
*/
error_reporting(0);

class online {

    private $config;
    private $delay;
    private $filename;
    private $maxonline;
    private $online;
    private $persent;
    private $rate;

    public function __construct() {
        // Данные для соединения с базой сервера
        $this->config['host'] = 'localhost';
        $this->config['user'] = 'root';
        $this->config['password'] = 'fv123';
        $this->config['db'] = 'l2j';
        //Настройки
        $this->filename = 'cache.txt'; //имя файла, в который будет кешироваться онлайн. ВНИМАНИЕ !!! В нем будет хранится реальный онлайн
        $this->delay = 1; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
        $this->persent = false; //в выводить % от максимально онлайна, или же онлайн с накруткой. для % - true , для онлайна  false
        $this->maxonline = 10; // Максимальный онлайн, если выводить в %
        $this->rate = 12; // Коєфициєнт накрутки онлайна, если выводится онлайн
    }

    public function get_online() {
        $this->new_online();
        if ($this->persent) {
            $online = ($this->online / $this->maxonline) * 100;
            return round($online);
        } else {
            $online = $this->online  * $this->rate;
            return round($online);
        }
    }

    private function new_online() {
        $last_update = time() - filemtime($this->filename);
        if ($last_update > $this->delay) {
            $this->online = $this->refresh_online();
            $fp = fopen($this->filename, 'w');
            fwrite($fp, $this->online);
            fclose($fp);
            return true;
        } else {
            $fp = fopen($this->filename, "r");
            if ($fp) {
                $this->online = fgets($fp, 999);
            }
            fclose($fp);
            return true;
        }
    }

    private function refresh_online() {
        $conn = new mysqli($this->config['host'], $this->config['user'], $this->config['password'], $this->config['db']);
        $query = "SELECT  count(0) FROM `characters` WHERE `online`!=0";
        $result = $conn->query($query);
        if (!$result) {
            return false;
        }
        $rows = $result->fetch_assoc();
        $conn->close();
        $result->free();
        return $rows['count(0)'];
    }

}

$online = new online;
echo $online->get_online();

В нем нас интересуют следующие строки:
// Данные для соединения с базой сервера
$this->config['host'] = 'localhost';
$this->config['user'] = 'root';
$this->config['password'] = 'fv123';
$this->config['db'] = 'l2j';
//Настройки
$this->filename = 'cache.txt'; //имя файла, в который будет кешироваться онлайн. ВНИМАНИЕ !!! В нем будет хранится реальный онлайн
$this->delay = 1; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
$this->persent = false; //в выводить % от максимально онлайна, или же онлайн с накруткой. для % - true , для онлайна false
$this->maxonline = 10; // Максимальный онлайн, если выводить в %
$this->rate = 12; // Коєфициєнт накрутки онлайна, если выводится онлайн
То что нужно изменить я выделил красным.
думаю с коннектом к бд все понятно)

1. изменить имя файла, для того.чтобы не могли узнать реальный онлайн.
например $this->filename = 'azazaonline.txt';
2. поставить приличный delay. например 300 или 600. Это очень снизит нагрузку на вашу бд. да и нету большого смысла обновлять так часто онлайн.
например $this->delay = 300;
обновление будет раз в 5 минут
3.1 если стоит $this->persent = true; то будет выводится % текущего онлайна от $this->maxonline
Например:
РЕАЛЬНЫЙ онлайн сервера = 6
$this->maxonline = 10;
Выводить будет - 60
3.2 если стоит $this->persent = false; то выводиться будет онлайн сервера умножением в $this->rate раз.
Например:
РЕАЛЬНЫЙ онлайн сервера = 6
$this->rate = 12;
Выводить будет - 72

Дальше нужно вывести онлайн или % на сайте.

Рассмотрим оба варианта вывода.
1. вывести онлайн с накруткой.
- создать папку в корне . Название можно любое, главное его не забыть ) Для примера назовем online
- в папке разместить php скрипт ( код выше)
Опять же, название можно любое, главное его не забыть ) Для примера назовем online.php
- в папке создать файл для кеширования. название из скрипта
2. На сайте вставить код.
Для его работы нужна jquery библиотека, в 95 % она уже используется, но если нет то ее стоит подключить
HTML:
 <script src="http://code.jquery.com/jquery-latest.min.js"></script>
Код для вставки в нужное место
HTML:
<div id="onlinebar-text" ></div>
<script>
    $(document).ready(function(){
        $.get("online/online.php", function(data) {  
        $("#onlinebar-text").text(data);   
});
    });
</script>
Выше указываем имя папки и имя пхп скрипта.
В идеале, код между тегами <script> добавить в конец страницы, чтобы она быстрей загружалась, а лиш потом в нужное поле ставилось значение с онлайном.

Второй вариант - вывод в % мы рассмотрим сразу с использованием статус бара ( типо картинка заполнена на %)
1. первый пункт все тот же - создать папку, файлы....смотрите выше.
Но добавляется в папку style.css файл и две картинки.
HTML:
.serv-im {
  background: url(back.png);
  width: 151px;
  height: 30px;
}
.serv-im .serv-scale {
  background: url(top.png);
  width: 0%;
  height: 21px;
  -webkit-transition: all 1s ease;
  -moz-transition: all 1s ease;
  -o-transition: all 1s ease;
  transition: all 1s ease;
}
Картинки:
- back.png - фоновая картинка.
- top.png - картинка, которая заполняет фон на необходимый %.
Пример картинок есть архиве ниже.
2. Опять же, если нужно библиотека jquery, до к коду добавиться.но она почти везде ( на форумах так точно ) используется.
код для вставки
HTML:
    <link href="online/style.css" rel="stylesheet" type="text/css" />
<div class="serv-im">
    <div id="onlinebar" class="serv-scale" style="width: 0%;"></div>
</div>
<script>
    $(document).ready(function(){
        $.get("online/online.php", function(data) {
        $("#onlinebar").css('width',data);
 
   
});
    });
</script>

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

P.S Я только учусь, мой код может быть корявым и не читаемым, но я учусь. Буду рад критики, и если объясните как правильно.
Кик, если будет не лень, поправь оформление как тебе нравится.
 

Вложения


Можно плагин для XenForo сделать у которого хороший API и легко интегрировать свои наработки и в разы меньше писать код. К тому же дальше можно раскрутить как удобно плагин
 
Можно плагин для XenForo сделать у которого хороший API и легко интегрировать свои наработки и в разы меньше писать код. К тому же дальше можно раскрутить как удобно плагин
Ну этот метод подойдет для всех форумов. ну или если вы сделали лендинг страницу. и сделали авторег на сервере
 
Вот еще
В шаблоне форума forum_list добавить после:
Код:
<xen:hook name="forum_list_nodes">
Это:
Код:
<div id="php_include"></div>
<script>$( "#php_include" ).load( "online.php" );</script>
Безымянный.webp
Файл который ниже, закинуть в корень сайта(форума),при этом не забудьте его отредактировать вписав туда свои данные MySQL
 

Вложения

Desperate, с этим модулем при каждом открытии страницы у каждого пользователя будет идти коннект к бд сервера и проверка статуса сервер...
Сколько читал, такое не желательно дело, ибо будет лишняя нагрузка на сервер.
Если уж хотите, вечером могу переделать ваш скрипт, добавить кеширование.
 
Desperate, с этим модулем при каждом открытии страницы у каждого пользователя будет идти коннект к бд сервера и проверка статуса сервер...
Сколько читал, такое не желательно дело, ибо будет лишняя нагрузка на сервер.
Если уж хотите, вечером могу переделать ваш скрипт, добавить кеширование.
Попробуйте,я щас другое пока делаю,полную статистику сервера в xenforo,как на ghtweb почти)
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Хорошая работа, а я как раз в ближайшее время собираюсь сделать статус сервера на сокетах, с кэшированием.
Насколько мне известно - в SW до сих пор этого нет, и если ДЦ не отвечает, то сайт оооочень долго грузиться.
В общем, если выйдет, поделюсь, может кому понадобиться тоже)
 
Вы бы еще написали код для регистрации, я думаю многим бы это пригодилось подобные коды на онлайн сервера это уже не первый случай, а вот на регу я еще не видел.)
 
Вы бы еще написали код для регистрации, я думаю многим бы это пригодилось подобные коды на онлайн сервера это уже не первый случай, а вот на регу я еще не видел.)
В принципе можно реализовать на XenForo зарегистрировался на форуме и соответственно зарегистрировался на сервере вводишь в игре только логин и пароль
 
Хорошая работа, а я как раз в ближайшее время собираюсь сделать статус сервера на сокетах, с кэшированием.
Насколько мне известно - в SW до сих пор этого нет, и если ДЦ не отвечает, то сайт оооочень долго грузиться.
В общем, если выйдет, поделюсь, может кому понадобиться тоже)
типо ? @fsockopen("ip", "port", $errno, $errstr, 3)) ? такое тоже лучше внешним делать... ибо реалько из-за этого сайт дольше грузтися будет.
по сути там пару троек строк добавить...
Вы бы еще написали код для регистрации, я думаю многим бы это пригодилось подобные коды на онлайн сервера это уже не первый случай, а вот на регу я еще не видел.)
Простую регистрацию? или регистрацию встроенную в форум как Кик предложил?
если простую, то если не горит, на след. выходных могу набросать. ( ну или если время будет среди недели )

В принципе можно реализовать на XenForo зарегистрировался на форуме и соответственно зарегистрировался на сервере вводишь в игре только логин и пароль

В принципе да, возможно. как будет время нужно будет посмотреть как рега на форумах происходит и как допилить регу)
 
типо ? @fsockopen("ip", "port", $errno, $errstr, 3)) ? такое тоже лучше внешним делать... ибо реалько из-за этого сайт дольше грузтися будет.
по сути там пару троек строк добавить...

Простую регистрацию? или регистрацию встроенную в форум как Кик предложил?
если простую, то если не горит, на след. выходных могу набросать. ( ну или если время будет среди недели )



В принципе да, возможно. как будет время нужно будет посмотреть как рега на форумах происходит и как допилить регу)
Да даже можно и не делать так, а считать форум как мастер-аккаунт а написать не большой плагин для создания Аккаунта https://mmo-dev.info/index.php?account/ вот тут и всё :) По сути это не долго
 
Да даже можно и не делать так, а считать форум как мастер-аккаунт а написать не большой плагин для создания Аккаунта https://mmo-dev.info/index.php?account/ вот тут и всё :-) По сути это не долго

Доделаю свой лк с ништяками и статистикой, и замучу такое) как ты предложил
 
типо ? @fsockopen("ip", "port", $errno, $errstr, 3)) ? такое тоже лучше внешним делать... ибо реалько из-за этого сайт дольше грузтися будет.
по сути там пару троек строк добавить...

Простую регистрацию? или регистрацию встроенную в форум как Кик предложил?
если простую, то если не горит, на след. выходных могу набросать. ( ну или если время будет среди недели )



В принципе да, возможно. как будет время нужно будет посмотреть как рега на форумах происходит и как допилить регу)
Ну хотя бы простую регистрацию, я думаю многим это будет полезно.) Хорошо отценим если сделаете конечно.)
 
типо ? @fsockopen("ip", "port", $errno, $errstr, 3)) ? такое тоже лучше внешним делать... ибо реалько из-за этого сайт дольше грузтися будет.
по сути там пару троек строк добавить...
Ну, что-то вроде этого, только таймаут поменьше, + кэширование. Пусть проверяет статус сервера раз в 5 минут, а при загрузке странице отдает кэш. думаю, вполне логично будет:-)
 
Ну, что-то вроде этого, только таймаут поменьше, + кэширование. Пусть проверяет статус сервера раз в 5 минут, а при загрузке странице отдает кэш. думаю, вполне логично будет:-)
Вы хотите игровым сервером отдавать кол-во онлайн? А какой в этом смысл? Если у вас проблемы с mysql сервером, то нужно начинать именно с данного вопроса...
Чтобы страница долго не грузилась, сделайте динамичную подгрузку блока онлайн и будет вам счастье.
А также если грамотно обработать исключения, выставить таймауты. То совсем будет все круто.
 
Вы хотите игровым сервером отдавать кол-во онлайн? А какой в этом смысл? Если у вас проблемы с mysql сервером, то нужно начинать именно с данного вопроса...
Чтобы страница долго не грузилась, сделайте динамичную подгрузку блока онлайн и будет вам счастье.
А также если грамотно обработать исключения, выставить таймауты. То совсем будет все круто.

Верно, на счет динамики, что-то я не сообразил. Спасибо за идею)
Но кэширование лишним все равно не будет. Думаю, не имеет смысла каждый раз при загрузке страницы прослушивать порт...
 
Для кэширование я бы использовал memcache или redis. Не приходилось его использовать для одной переменной, но хранить в текстовом файле инфу не комильфо. Чтобы не накладной было можно ещё туда инфу какую-нибудь записать, типо новостей в случае их хранения в БД, топ пвп и пк...
 
Меня довольно часто спрашивают как вывести онлайн на форуме или на промо странице.
Брать за это деньги уже не позволяет совесть, поэтому специально для mmo-develop.ru набросал этот мануал.

В статье будет предложено несколько вариантов вывода:
как и в % от максимального онлайна ( что сейчас можно);
с накруткой ( как раньше ).

Для начала нам понадобится пхп скрипт, который и будет выводить или онлайн или %.
С него и начнем.
Выкладываю готовый код, ниже будет пояснения.
PHP:
<?php

/**
* Description of online
*
* @author Anton Faibyshev
* email: faibyshevao@gmail.com
* skype: zGrandy
* Специально для mmo-develop.ru
*/
error_reporting(0);

class online {

    private $config;
    private $delay;
    private $filename;
    private $maxonline;
    private $online;
    private $persent;
    private $rate;

    public function __construct() {
        // Данные для соединения с базой сервера
        $this->config['host'] = 'localhost';
        $this->config['user'] = 'root';
        $this->config['password'] = 'fv123';
        $this->config['db'] = 'l2j';
        //Настройки
        $this->filename = 'cache.txt'; //имя файла, в который будет кешироваться онлайн. ВНИМАНИЕ !!! В нем будет хранится реальный онлайн
        $this->delay = 1; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
        $this->persent = false; //в выводить % от максимально онлайна, или же онлайн с накруткой. для % - true , для онлайна  false
        $this->maxonline = 10; // Максимальный онлайн, если выводить в %
        $this->rate = 12; // Коєфициєнт накрутки онлайна, если выводится онлайн
    }

    public function get_online() {
        $this->new_online();
        if ($this->persent) {
            $online = ($this->online / $this->maxonline) * 100;
            return round($online);
        } else {
            $online = $this->online  * $this->rate;
            return round($online);
        }
    }

    private function new_online() {
        $last_update = time() - filemtime($this->filename);
        if ($last_update > $this->delay) {
            $this->online = $this->refresh_online();
            $fp = fopen($this->filename, 'w');
            fwrite($fp, $this->online);
            fclose($fp);
            return true;
        } else {
            $fp = fopen($this->filename, "r");
            if ($fp) {
                $this->online = fgets($fp, 999);
            }
            fclose($fp);
            return true;
        }
    }

    private function refresh_online() {
        $conn = new mysqli($this->config['host'], $this->config['user'], $this->config['password'], $this->config['db']);
        $query = "SELECT  count(0) FROM `characters` WHERE `online`!=0";
        $result = $conn->query($query);
        if (!$result) {
            return false;
        }
        $rows = $result->fetch_assoc();
        $conn->close();
        $result->free();
        return $rows['count(0)'];
    }

}

$online = new online;
echo $online->get_online();

В нем нас интересуют следующие строки:
// Данные для соединения с базой сервера
$this->config['host'] = 'localhost';
$this->config['user'] = 'root';
$this->config['password'] = 'fv123';
$this->config['db'] = 'l2j';
//Настройки
$this->filename = 'cache.txt'; //имя файла, в который будет кешироваться онлайн. ВНИМАНИЕ !!! В нем будет хранится реальный онлайн
$this->delay = 1; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
$this->persent = false; //в выводить % от максимально онлайна, или же онлайн с накруткой. для % - true , для онлайна false
$this->maxonline = 10; // Максимальный онлайн, если выводить в %
$this->rate = 12; // Коєфициєнт накрутки онлайна, если выводится онлайн
То что нужно изменить я выделил красным.
думаю с коннектом к бд все понятно)

1. изменить имя файла, для того.чтобы не могли узнать реальный онлайн.
например $this->filename = 'azazaonline.txt';
2. поставить приличный delay. например 300 или 600. Это очень снизит нагрузку на вашу бд. да и нету большого смысла обновлять так часто онлайн.
например $this->delay = 300;
обновление будет раз в 5 минут
3.1 если стоит $this->persent = true; то будет выводится % текущего онлайна от $this->maxonline
Например:
РЕАЛЬНЫЙ онлайн сервера = 6
$this->maxonline = 10;
Выводить будет - 60
3.2 если стоит $this->persent = false; то выводиться будет онлайн сервера умножением в $this->rate раз.
Например:
РЕАЛЬНЫЙ онлайн сервера = 6
$this->rate = 12;
Выводить будет - 72

Дальше нужно вывести онлайн или % на сайте.

Рассмотрим оба варианта вывода.
1. вывести онлайн с накруткой.
- создать папку в корне . Название можно любое, главное его не забыть ) Для примера назовем online
- в папке разместить php скрипт ( код выше)
Опять же, название можно любое, главное его не забыть ) Для примера назовем online.php
- в папке создать файл для кеширования. название из скрипта
2. На сайте вставить код.
Для его работы нужна jquery библиотека, в 95 % она уже используется, но если нет то ее стоит подключить
HTML:
 <script src="http://code.jquery.com/jquery-latest.min.js"></script>
Код для вставки в нужное место
HTML:
<div id="onlinebar-text" ></div>
<script>
    $(document).ready(function(){
        $.get("online/online.php", function(data) {
        $("#onlinebar-text").text(data); 
});
    });
</script>
Выше указываем имя папки и имя пхп скрипта.
В идеале, код между тегами <script> добавить в конец страницы, чтобы она быстрей загружалась, а лиш потом в нужное поле ставилось значение с онлайном.

Второй вариант - вывод в % мы рассмотрим сразу с использованием статус бара ( типо картинка заполнена на %)
1. первый пункт все тот же - создать папку, файлы....смотрите выше.
Но добавляется в папку style.css файл и две картинки.
HTML:
.serv-im {
  background: url(back.png);
  width: 151px;
  height: 30px;
}
.serv-im .serv-scale {
  background: url(top.png);
  width: 0%;
  height: 21px;
  -webkit-transition: all 1s ease;
  -moz-transition: all 1s ease;
  -o-transition: all 1s ease;
  transition: all 1s ease;
}
Картинки:
- back.png - фоновая картинка.
- top.png - картинка, которая заполняет фон на необходимый %.
Пример картинок есть архиве ниже.
2. Опять же, если нужно библиотека jquery, до к коду добавиться.но она почти везде ( на форумах так точно ) используется.
код для вставки
HTML:
    <link href="online/style.css" rel="stylesheet" type="text/css" />
<div class="serv-im">
    <div id="onlinebar" class="serv-scale" style="width: 0%;"></div>
</div>
<script>
    $(document).ready(function(){
        $.get("online/online.php", function(data) {
        $("#onlinebar").css('width',data);

 
});
    });
</script>

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

P.S Я только учусь, мой код может быть корявым и не читаемым, но я учусь. Буду рад критики, и если объясните как правильно.
Кик, если будет не лень, поправь оформление как тебе нравится.
Прикольная штука,а не подскажешь как сделать:
В данный момент у меня так
1.webp
А как сделать,вот так
2.webp
И например максимальный онлайн 200,то где OFF,если сервер включен будет написано 0/200
Понимаю что руками,но я в этом слабоват
 
Назад
Сверху Снизу