Zobrazení uptime realmu

Z WoWResource Wiki
Přejít na: navigace, hledání

Úvod

Informace o době běhu konkrétního realmu (procesu mangos-worldd) se nachází v databázi realmd v tabulce uptime. Zde se ukládá a také aktualizuje údaj, kolik času uplynulo od spuštění. Perioda aktualizace tohoto údaje lze nastavit v souboru mangosd.conf pro daný realm v položce UpdateUptimeInterval v minutách.

V tabulce uptime jsou ukládány údaje pro každý realm samostatně a realmy jsou zde rozlišeny dle sloupce realmid, které odpovídá položce RealmID v nastavení realmu.

Přečtení z databáze

Přečtení doby běhu realmu z nejnovějšího řádku pro daný realm je vcelku jednoduché:

<?php

class Realm
{
  var $Id;
  var $Database;
 
  function Uptime()
  {
    $DbResult = $this->Database->query('SELECT uptime FROM realmd.uptime WHERE realmid='.$this->Id.' ORDER BY starttime DESC LIMIT 1');
    $DbRow = $DbResult->fetch_assoc();
    return($DbRow['uptime']);
  }
}

?>

Jiná možnost jak vyčítat dobu běhu je srovnávat čas startu realmu a aktuální čas.

<?php

class Realm
{
  var $Id;
  var $Database;
 
  function Uptime()
  {
    $DbResult = $this->Database->query('SELECT uptime FROM realmd.startime WHERE realmid='.$this->Id.' ORDER BY starttime DESC LIMIT 1');
    $DbRow = $DbResult->fetch_assoc();
    return(time() - $DbRow['starttime']);
  }
}

?>

Oba případy jak první tak druhý je nutno ošetřit pro případ, že server selže a bude nedostupný (offline). Pak pokud realm skončí s chybou a tedy neběží, zobrazení doby běhu není správné a je nutno místo něj zobrazit text informující o offline stavu realmu.

Použití

Před použitím je nutné nastavit Id realmu a inicializovat připojení k databázi. Pak může být použití následující:

<?php

$Realm = new Realm();
$Realm->Id = 1;
$Realm->Database = new mysqli('localhost', 'user', 'password');
echo('Realm id '.$Realm->Id.' běží '.$Realm->Uptime().' sekund');

?>

Zobrazení pro lidi

Místo strojového zobrazení počtu sekund lze zobrazit čas běhu lépe v lidmi čitelné podobě:

<?php

function PluralText($Value, $PluralForms)
{
  if($Value == 1) return($PluralForms[0]);
  else if(($Value > 1) and ($Value < 5)) return($PluralForms[1]);
  else return($PluralForms[2]);
}

function HumanReadableTime($Time)
{
  $TimeText = array(
    array('sekunda', 'sekundy', 'sekund'),
    array('minuta', 'minuty', 'minut'),
    array('hodina', 'hodiny', 'hodin'),
    array('den', 'dny', 'dnů'),
  );
  $TimeElements = array(
    $Time % 60, 
    $Time / 60 % 60,
    $Time / 60 / 60 % 24,
    round($Time / 60 / 60 / 24),
  );
  $Result = '';
  foreach($TimeElements as $Index => $TimeElement)
  {
    if($TimeElement > 0) $Result = $TimeElement.' '.PluralText($TimeElement, $TimeText[$Index]).' '.$Result;
  }
  return($Result);
}

$Realm = new Realm();
$Realm->Id = 1;
$Realm->Database = new mysqli('localhost', 'user', 'password');
echo('Doba běhu realmu id '.$Realm->Id.': '.HumanReadableTime($Realm->Uptime()));

?>