From ef3de1e23827e3debac3a1760ce03e02966a9e7e Mon Sep 17 00:00:00 2001 From: Dominik Hebeler <dominik@suma-ev.de> Date: Thu, 28 Mar 2019 14:39:38 +0100 Subject: [PATCH] Count is faster --- app/Http/Controllers/AdminInterface.php | 47 +++++++++++++++++++++++-- app/get_dates.awk | 9 ----- 2 files changed, 45 insertions(+), 11 deletions(-) delete mode 100644 app/get_dates.awk diff --git a/app/Http/Controllers/AdminInterface.php b/app/Http/Controllers/AdminInterface.php index 711a616af..24da8a7a1 100644 --- a/app/Http/Controllers/AdminInterface.php +++ b/app/Http/Controllers/AdminInterface.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Redis; use Response; +use \SplFileObject; class AdminInterface extends Controller { @@ -112,11 +114,13 @@ class AdminInterface extends Controller for ($i = 1; $i <= $days; $i++) { $logDate = "/var/log/metager/archive/mg3.log.$i"; if (file_exists($logDate)) { + $now = Carbon::now(); + $sameTimeLine = $this->findLineForTime($logDate, Carbon::now()); if ($interface === "all") { - $sameTime = exec("awk -v hour=\"" . date('H') . "\" -v minute=\"" . date('i') . "\" -v second=\"" . date('s') . "\" -f " . app_path('get_dates.awk') . " " . $logDate . " | wc -l"); + $sameTime = exec("head -n " . $sameTimeLine . " " . $logDate . " | wc -l"); $insgesamt = exec("wc -l $logDate | cut -f1 -d' '"); } else { - $sameTime = exec("awk -v hour=\"" . date('H') . "\" -v minute=\"" . date('i') . "\" -v second=\"" . date('s') . "\" -f " . app_path('get_dates.awk') . " " . $logDate . " | grep interface=" . $interface . " | wc -l"); + $sameTime = exec("head -n " . $sameTimeLine . " " . $logDate . " | grep interface=" . $interface . " | wc -l"); $insgesamt = exec("cat $logDate | grep interface=" . $interface . " | wc -l"); } if ($insgesamt > $rekordTag) { @@ -161,6 +165,45 @@ class AdminInterface extends Controller } } + + private function findLineForTime($file, $time) + { + $file = new SplFileObject($file); + $file->seek(PHP_INT_MAX); + $numberOfRows = $file->key(); + + $minLine = 1; + $maxLine = $numberOfRows; + $current = round($maxLine / 2); + + $finished = false; + $counter = 0; + while (!$finished) { + $counter++; + if ($counter == 1000) { + return $maxLine; + } + $current = $minLine + round(($maxLine - $minLine) / 2); + $file->seek($current); + $line = $file->fgets(); + + # Extract time from line + $line = substr($line, 1); + $line = substr($line, 0, strpos($line, "]")); + $lineTime = Carbon::createFromFormat('D M d H:i:s', $line)->day(date('d'))->month(date('m'))->year(date('Y')); + + if (($maxLine - $minLine) <= 1) { + return $maxLine; + } else if ($time < $lineTime) { + $maxLine = $current; + continue; + } else if ($time > $lineTime) { + $minLine = $current; + continue; + } + } + } + public function check() { $q = ""; diff --git a/app/get_dates.awk b/app/get_dates.awk deleted file mode 100644 index 0024c7b7a..000000000 --- a/app/get_dates.awk +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN { - end_t = mktime("2019 02 25 " hour " " minute " " second) - FS="[: \\]]" -} - -{ - now = mktime("2019 02 25 " $4 " " $5 " " $6) - if(now <= end_t) {print} -} -- GitLab