HELP , Статус сервера Online/Offline

Kostik1995

Путник
Пользователь
Сообщения
16
Розыгрыши
0
Репутация
0
Реакции
0
Баллы
0
Приветствую слущай подскажите пожалуйста
вот онлайн вывел все сделал красиво как хотел ну вот не задача проблема с отображением Онлайн и оффлайн сервер онлайн а он либо не чекает либо я дурак

Код:
Код:
<?php

//include "config.php"; // подключаем файл с настройками подключения
class online {

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

public function __construct() {
// Данные для соединения с базой сервера
$this->config['host'] = 'localhost';
$this->config['user'] = 'root';
$this->config['password'] = '12344321';
$this->config['db'] = 'xf_forum';
//-Настройки отображаения статус сервера-//
$servergame="localhost"; // IP сервера
$portgame="7777"; // Порт игрового сервера [7777]

//Настройки
$this->filename = 'cache.txt'; //имя файла, В нем будет хранится реальный онлайн
$this->delay = 120; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
}

public function get_online()
{
$this->new_online();
$online = ($this->online);
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)'];
}


}




class status_bar {
public static function renderWidget(\XF\Widget\AbstractWidget $abstractWidget)
{

$online = new online; // Создает переменную Онлайна

$fp = @fsockopen($servergame, $portgame, $errno, $errstr, 1);
$game = ($fp >= 1) ? 'Online.png': 'offline.png'; //запрос ответа от гейм сервера


return $abstractWidget->renderer('server_widget', [
// Здесь нужно указать параметры, которые нужно отображать в виджете
'online_2' => $online->get_online(), //Выводит Онлайн
'status_1' => $game //гейм сервер
]);
}
}
вот основной код отображения онлайн или оффлайн сервер не могу опнять
$fp = @fsockopen($servergame, $portgame, $errno, $errstr, 1);
$game = ($fp >= 1) ? 'Online.png': 'offline.png'; //запрос ответа от гейм сервера
 

$fp = @fsockopen($servergame, $portgame, $errno, $errstr, 1);

у тебя переменные $servergame и $portgame не существуют в функции renderWidget, они объявлены в конструкторе класса "online" и никак не используются
 
Ух ты, ты был прав а я голову сломал!
а не подскажеш как его использыват в классе Online данный код
 
если это принципиально должно быть в классе "online"
PHP:
<?php

   //include "config.php"; // подключаем файл с настройками подключения
   class online{

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

      private $servergame;
      private $portgame;

      public function __construct(){
         // Данные для соединения с базой сервера
         $this->config['host'] = 'localhost';
         $this->config['user'] = 'root';
         $this->config['password'] = '12344321';
         $this->config['db'] = 'xf_forum';
         //-Настройки отображаения статус сервера-//
         $this->servergame = "localhost"; // IP сервера
         $this->portgame = "7777"; // Порт игрового сервера [7777]

         //Настройки
         $this->filename = 'cache.txt'; //имя файла, В нем будет хранится реальный онлайн
         $this->delay = 120; // Время обновления онлайна из базы . например для обновления раз в 5 минут необходимо установить значение 300
      }

      public function get_online(){
         $this->new_online();
         $online = ($this->online);

         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)'];
      }

      /**
       * @return string
       */
      public function getServergame(){
         return $this->servergame;
      }

      /**
       * @return string
       */
      public function getPortgame(){
         return $this->portgame;
      }

   }

   class status_bar{

      public static function renderWidget(\XF\Widget\AbstractWidget $abstractWidget){

         $online = new online; // Создает переменную Онлайна

         $fp = @fsockopen($online->getServergame(), $online->getPortgame(), $errno, $errstr, 1);
         $game = ($fp >= 1) ? 'Online.png' : 'offline.png'; //запрос ответа от гейм сервера

         return $abstractWidget->renderer(
            'server_widget', [
            // Здесь нужно указать параметры, которые нужно отображать в виджете
            'online_2' => $online->get_online(),
            //Выводит Онлайн
            'status_1' => $game
            //гейм сервер
         ]
         );
      }
   }

либо укажи значение переменных в самой функции "renderWidget"
 
используемый мною вариант, статус онлайна + количество онлайна
используется кэширование, чтобы не флудили сильно через сайт на порт сервера, непосредственно с сервера статус считывается только каждые X секунд, в другое время отдаются сохраненные данные.
PHP:
//
// Проверка статуса серверов и т.п.
//
function get_status($ip, $port, &$info, $status_refresh_time = 5)
{
    global $data_dir;
    $info = array();
    $data_file = "scripts/cache/{$ip}-{$port}.status";

    if (!file_exists($data_file))
    {
        $fh = fopen($data_file, "w+");

        if ($port > 7000)
        {
            fputs($fh, "time:online:world:max:current:playing:store:unk0:unk1:unk2:unk3:unk4:unk5:unk6:unk7:unk8:unk9:unk10:unk11\n");
            fputs($fh, "0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0\n");
        }
        else
        {
            fputs($fh, "time:online\n");
            fputs($fh, "0:0\n");
        }

        fclose($fh);
    }

    $fh = fopen($data_file, "r");
    $str = trim(fgets($fh));
    $keys = explode(":", $str);
    $str = trim(fgets($fh));
    $values= explode(":", $str);
    fclose($fh);
    $info = array_combine($keys, $values);
    unset($keys, $values);

    if (($info["time"] + $status_refresh_time) < time())
    {
        if ($fp = @fsockopen($ip, $port, $ERROR_NO, $ERROR_STR, (float) 0.5))
        {
            if ($port > 7000)
            {
                $packet = pack("vCi", 6, 0, -3);
                fwrite($fp, $packet);
                $returned = fread($fp, 73);
                $info = unpack("vtime/Conline/iworld/imax/icurrent/iplaying/istore/iunk0/iunk1/iunk2/iunk3/iunk4/iunk5/iunk6/iunk7/iunk8/iunk9/iunk10/iunk11", $returned);
            }

            fclose($fp);
            $info["online"] = 1;
        }
        else
        {
            $info["online"] = 0;
            $info["current"] = 0;
            $info["store"] = 0;
        }

        $info["time"] = time();
        $fh = fopen($data_file, "w+");
        fputs($fh, implode(":", array_keys($info))."\n");
        fputs($fh, implode(":", array_values($info))."\n");
        fclose($fh);
    }

    return $info["online"];
}
 
Не так не так не получаеться, просто загружает белый лист форума)

Спасибо вам огромное , очень вам благодарен!!!!!!!!!!!!
 
Назад
Сверху Снизу