1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
  3. Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Веб PHP Мониторинг сервер(-ов)

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем Sparksys, 31 авг 2015.

Статус темы:
Закрыта.
  1. Автор темы
    Sparksys

    Sparksys Активный участник Пользователь

    Баллы:
    76
    Искал мониторинг для своего сайта и наткнулся на замечательный мониторинг сделанный на js, в нем проверка онлайна шла на другом сайте, но сайт имел протокол HTTP (Как вы знаете нельзя подключить к сайту работающий на протоколе HTTPS, скрипты и стили с другого сайта который работает на HTTP.) и мне пришлось придумать скрипт который бы проверял онлайн на этом же сайте и работал под протоколом HTTPS.

    Ну так приступим.
    Создам в корне вашего сайта ну или в другом месте папку с именем "mon" и в ней создаем 4 файла:
    • index.php - в котором будет сам скрипт и который нужно будет подключить к сайту.
    • style.css - в котором будет лежать стил самого мониторинга.
    • form_online.php - в котором будет лежать оформление для включенного сервера.
    • form_ofline.php - в котором будет лежать оформление для выключенного сервера.
    В файл index.php помещаем следующий скрипт (комментарии внутри):
    PHP:
    <?php
    /* Масив с серверами */
    $servers = array(
        array(
    'name' => 'HiMagiC''address' => 'craftm.ru:25468'),
        array(
    'name' => 'HiMagiC''address' => 'craftm.ru:25461')
    );
    /* ------------ */

    /* Обработка масива */
    foreach ($servers as $server) {
    $json file_get_contents('http://jsonmc.tk/old/?address='.$server[address]); //Импорт информации о сервере.
    $dump json_decode($json); //Де кодировка полученного json в объект масива.
    $name $server[name]; //Кладем в переменную имя сервера.
    if (!$dump->{error}) { //Если сервер в сети то выводим следующее..
        
    $user $dump->{player_online}.'/'.$dump->{player_max}; //Кладем в переменную значение текущего онлайна и максимального кол-во слотов через слейс "0/20".
        
    $record 'Рекорд: '.$dump->{online_max}.' человек'//Кладем в переменную рекордное число онлайн.
        
    include 'form_online.php'//Подключаем оформление для включенного сервера.
    } else { //Если сервер не в сети то выводим следующее..
        
    include 'form_ofline.php'//Подключаем оформление для выключенного сервера.
        
    };
    };
    /* ------------ */
    В этом варианте все сервера хранятся в масиве, но так же их можно хранить в БД MySQL и код будет выглядеть так: (Комментарии внутри)
    PHP:
    <?php
    /* Подключение к БД */
    $bdhost 'localhost'//Адрес MySQL сервера.
    $bdlogin 'spark'//Логин к БД mySQL
    $bdpass '37004389'//Пароль к БД mySQL
    $bdname 'test'//БД mySQL.
    $bdtable 'server_list'//Название таблицы с серверами. Это поле можно оставить как есть, оно предназначено для того если вы хотите назвать таблицу в БД по другому.

    mysql_connect($bdhost$bdlogin$bdpass) or die(mysql_error()); //Соединяемся с mySQL.
    mysql_query("SET NAMES 'utf8';"); //Кодировка соединения.
    mysql_query("SET CHARACTER SET 'utf8';"); //Кодировка соединения.
    mysql_query("SET SESSION collation_connection = 'utf8_general_ci';"); //Кодировка соединения.
    mysql_select_db($bdname) or die(mysql_error()); //Соединяемся с БД mySQL.
    /* ------------ */

    /*Обработка MySQL данных */
    $sql mysql_query("SELECT * FROM $bdtable WHERE 1") or die(mysql_error()); //Вынимаем список серверов из БД и записываем в переменную.
    while ($servers mysql_fetch_array($sql)) { //Записываем масив в переменную.
        
    $servers = array($servers); //Записываем масив в масив и в переменную.

        
    foreach ($servers as $server) {
        
    $json file_get_contents('http://jsonmc.tk/old/?address='.$server[address]); //Импорт информации о сервере.
        
    $dump json_decode($json); //Де кодировка полученного json в объект масива.
        
    $name $server[name]; //Кладем в переменную имя сервера.
        
    if (!$dump->{error}) { //Если сервер в сети то выводим следующее..
           
    $user $dump->{player_online}.'/'.$dump->{player_max}; //Кладем в переменную значение текущего онлайна и максимального кол-во слотов через слейс "0/20".
            
    $record 'Рекорд: '.$dump->{online_max}.' человек'//Кладем в переменную рекордное число онлайн.
        
    include 'form_online.php'//Подключаем оформление для включенного сервера.
    } else { //Если сервер не в сети то выводим следующее..
        
    include 'form_ofline.php'//Подключаем оформление для выключенного сервера.
            
    };
        };
    };
    /* ------------ */
    Ну а сама таблица выглядит так:
    Код:
    CREATE TABLE IF NOT EXISTS `server_list` (
      `id` int(11) NOT NULL,
      `name` text NOT NULL,
      `address` text NOT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
    В обоих случаях адрес указывается в формате IP : PORT !

    В файл style.css посещаем следующее:
    Код:
    .block {
      width: 100%;
      height: 30px;
      border-width: 2px;
      border-style: dashed;
      margin-bottom: 6px;
    }
    .block_left {
        float: left;
        margin: 6px;
    }
    .block_right {
        float: right;
        margin: 6px;
    }
    
    .info {display: none;}
    .block:hover .info {display: block;}
    .block:hover .none {display: none;}
    
    .color_ok {background-color: aliceblue; border-color: rgb(186, 204, 220);}
    .color_error {background-color: rgb(225, 107, 107); border-color: rgb(223, 172, 179);}
    
    В файл form_online.php посещаем следующее:
    HTML:
    <link rel="stylesheet" href="./style.css" />
    <div class="block color_ok">
        <div class="none block_left"><?=$name?></div><div class="info block_left"><?=$record?></div>
        <div class="none block_right"><?=$user?></div><div class="info block_right"><a href="#">Еще</a></div>
    </div>
    
    В файл form_ofline.php посещаем следующее:
    HTML:
    <link rel="stylesheet" href="./style.css" />
    <div class="block color_error">
        <div class="none block_left"><?=$name?></div><div class="info block_left">Технические работы</div>
        <div class="none block_right">Технические работы</div><div class="info block_right"><a href="#">Еще</a></div>
    </div>
    
    Далее вставляем в нужное место сайта с помощью include в PHP или с помощью iframe в HTML

    Думаю все ясно и понятно, появятся вопросы, пишите здесь или в официальную тему на форум CraftM.ru тут.
     
  2. Vladlen_198

    Vladlen_198 Старожил Пользователь

    Баллы:
    108
    Skype:
    ultrashock98
    Имя в Minecraft:
    UltraShock
    Я конечно понимаю что можно писать говнокод на любом языке. Но может всё же научитись писать чистый код ? Мало того что парсер не твой, но может не стоит так говнокодить ?
     
  3. Автор темы
    Sparksys

    Sparksys Активный участник Пользователь

    Баллы:
    76
    Говнокодю, не говнокодю мне как то пофиг, я пишу коды на тех знаниях которые знаю. Парсер да не мой, но я сделал код для того чтобы вывести значения из этого парсера в нормальном виде. Если не нравится не стоит отвечать тогда, я такого не приветствую.
     
  4. TetrissWorld

    TetrissWorld Активный участник Пользователь

    Баллы:
    76
    Skype:
    qazwsx200221
    Имя в Minecraft:
    Tetriss
    Как-то убого выглядит
     
  5. book777

    book777 Старожил Пользователь

    Баллы:
    123
    Немного ашарашен этой темой. Зачем создавать парсерв парсера, если можно самому поставить у себя скрипт (не думаю, если есть https, то будет бесплатный хостинг)
    P.S. скоро обновлю с @Vladlen_198 jsonmc
    Для ТС могу посоветовать http://rubukkit.org/threads/monajax-v1-4-1.99529/
     
  6. Автор темы
    Sparksys

    Sparksys Активный участник Пользователь

    Баллы:
    76
    1. Начальный парсер вынимает данные токо с 1 сервера который указан в адресе.
    2. Начальный парсер выводит Json строку.

    3. Мой как вы говорите парсер парсера, выводит мониторинг указанных серверов, преобразовывает json строку в переменные и отображает в нормальном виде.
     
  7. hgfhfgh

    hgfhfgh Новичок Пользователь

    Баллы:
    6
    А если кто-то на этой хрени решит свой рейтинг запилить с тыщей сервов?))
    Ох и забанят нахер такое чудо за ддос))
    Как говорилось раннее, больше одного сервера лучше опрашивать самому, а не парсить парсер, который может тоже парсит парсер. Иначе все погрязнем в лагах))
    PHP:
    function query($ip$port$timeout 3)
    {
        if (!
    function_exists('socket_create'))echo "Нихера сокеты недоступны";
       else{
        
    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
        
    socket_set_option($socketSOL_SOCKETSO_SNDTIMEO, array('sec' => (int)$timeout'usec' => 0));
        
    socket_set_option($socketSOL_SOCKETSO_RCVTIMEO, array('sec' => (int)$timeout'usec' => 0));
        if (
    $socket === FALSE || @socket_connect($socket$ip, (int)$port) === FALSE)return FALSE;
        
    socket_send($socket"\xFE\x01"20);
        
    $len socket_recv($socket$data5120);
        
    socket_close($socket);
        if (
    $len || $data[0] !== "\xFF")return FALSE;
        
    $data substr($data3);
        
    $data iconv('UTF-16BE''UTF-8'$data);
        if (
    $data[1] === "\xA7" && $data[2] === "\x31"){$data str_replace(array("§a""§b""§c""§d""§e""§f""§0""§1""§2""§3""§4""§5""§6""§7""§8""§9"),''$data); $data explode("\x00"$data); return Array('HostName' => $data[3], 'Players' => intval($data[4]), 'MaxPlayers' => intval($data[5]), 'Version' => $data[2]);}
        
    $data str_replace(array("§a""§b""§c""§d""§e""§f""§0""§1""§2""§3""§4""§5""§6""§7""§8""§9"),''$data); //если 1.3
        
    $data explode("\xA7"$data);
        return Array(
    'HostName' => substr($data[0], 0, -1), 'Players' => isset($data[1]) ? intval($data[1]) : 0'MaxPlayers' => isset($data[2]) ? intval($data[2]) : 0'Protocol' => 0'Version' => '1.3');
       }
    return;
    }
    Например шмат говнокода xpaw`а. Этой функцией можно без опаски и с сосоелем на борту опрашивать тысячи сервов. делов-то
     
    Последнее редактирование: 16 сен 2016
  8. Kimato

    Kimato Активный участник Пользователь

    Баллы:
    76
    @hgfhfgh, все нормально?
     
  9. hgfhfgh

    hgfhfgh Новичок Пользователь

    Баллы:
    6
    Вообще-то нет, пока такие как Вы не перестанут блистать своими проницательными выкаками про набивание постов и подъёмы старых тем)))
    Поясню идею и для очередного Вас. Я сюда зашел с поисковика - с яндекса, увидел то, как лучше вообще не делать и определил, почему так делать нельзя и как делать лучше. Для тех, кто следующим зайдет на эту тему с поисковика, а не для тех, кто мечтает выискивать так называемых некропостеров.
    Это, по идее, у меня должен назревать вопрос: "У Вас всё нормально?"))
     
  10. Автор темы
    Sparksys

    Sparksys Активный участник Пользователь

    Баллы:
    76
Статус темы:
Закрыта.

Поделиться этой страницей