我有一个 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 )
如果我能提供更多信息,我很乐意这样做。但是,不知道从这里做什么。提前致谢。
编辑:如果有人知道如何更有效地做到这一点,我完全赞成重写。这不适合我。