1

我有一个 cron 作业每 10-15 分钟运行一次,在我的数据库中对 minecraft 服务器执行 ping 操作,如果其中一个返回“离线”,数据库会记录发生这种情况的时间并将其粘贴到lastDT(最后一次停机时间)表中。我的问题是,我怎样才能收集所有的时间,并在每个月底计算出平均停机时间(如果有的话)。我认为这将是((totalMinutesInMonth-totalMinutesOfDT)*100). 有没有办法做到这一点?为了更好地了解我正在处理的内容,这里有一些代码可供参考:

<?php
  require_once './inc/connectToDB.php';
  date_default_timezone_set('UTC');
  session_start();

  try {
  $collectServers = $database->prepare('SELECT * FROM servers');
  $collectServers->execute();
  $serversDat = $collectServers->fetchAll(PDO::FETCH_ASSOC);
  } catch (PDOException $e) {
    error_log($e->getMessage());
    exit();
  }

  foreach ($serversDat as $server) {
    try {
      $remoteCon = @fsockopen(@gethostbyname($server['address']),$server['port'],$errno,$errstr,1);
      $connected = false;
      if (@is_resource($remoteCon)) { $connected = true; @fclose($remoteCon); }
      if ($connected) { $serverStat = 'Online'; } else { $serverStat = 'Offline'; }
      if ($serverStat == 'Offline') {
    $downTime=date('H:i:s',time());
      } else {
    $downTime=0;
      }
      $reinsert = $database->prepare('UPDATE servers SET status=:status,lastPing=:time,lastDT=:lastdt WHERE id=:id');
      $reinsert->bindValue(':id',$server['id'],PDO::PARAM_INT);
      $reinsert->bindValue(':status',$serverStat,PDO::PARAM_STR);
      $reinsert->bindValue(':time',date('H:sa T',time()),PDO::PARAM_STR);
      $reinsert->bindValue(':lastdt',$downTime,PDO::PARAM_STR);
      $reinsert->execute();
    } catch (PDOException $e) {
      error_log($e->getMessage());
      exit();
    }
  }

  unset($database);
  exit();
?>

数据库表如下所示:

图片 ( http://i.imgur.com/0ypc99g.png )

如果我能提供更多信息,我很乐意这样做。但是,不知道从这里做什么。提前致谢。

编辑:如果有人知道如何更有效地做到这一点,我完全赞成重写。这不适合我。

4

1 回答 1

0

似乎找到服务器宕机的时间只是等式的一半。您还需要知道服务器何时恢复。

Down at 10:00AM, Up at 10:15AM equals 15min downtime.

您需要将其存储在数据库中的某个地方。这不是解决方案,但它似乎是下一步。

于 2013-06-07T05:16:25.310 回答