diff --git a/public/index.php b/public/index.php index 549b156..78ae56b 100644 --- a/public/index.php +++ b/public/index.php @@ -2551,17 +2551,30 @@ switch ($action) { } require_once BASE_PATH . '/src/AccessLogParser.php'; require_once BASE_PATH . '/src/AsnLookup.php'; - $accessParser = new AccessLogParser('/var/log/apache2', apacheAccessLog()); - $accessStats = $accessParser->stats(); - $adminData['stats_readable'] = $accessParser->isReadable(); - $adminData['stats_pages'] = array_slice($accessStats['pages'], 0, 30, true); - $adminData['stats_books'] = array_slice($accessStats['books'], 0, 20, true); - // Lookup AS pour les top 200 IPs - $topIps = array_slice($accessStats['ips'], 0, 200, true); - $asnMap = (new AsnLookup())->batchLookup(array_keys($topIps)); - $asList = AsnLookup::aggregateByAs($topIps, $asnMap); - $adminData['stats_as'] = $asList; - $adminData['stats_as_groups'] = AsnLookup::applyGroups($asList, asGroups()); + + $statsCacheFile = DATA_PATH . '/.stats_cache.json'; + $statsRaw = null; + if (file_exists($statsCacheFile) && (time() - filemtime($statsCacheFile)) < 60) { + $statsRaw = json_decode((string) file_get_contents($statsCacheFile), true) ?: null; + } + if ($statsRaw === null) { + $accessParser = new AccessLogParser('/var/log/apache2', apacheAccessLog()); + $accessStats = $accessParser->stats(); + $topIps = array_slice($accessStats['ips'], 0, 200, true); + $asnMap = (new AsnLookup())->batchLookup(array_keys($topIps)); + $statsRaw = [ + 'readable' => $accessParser->isReadable(), + 'pages' => array_slice($accessStats['pages'], 0, 30, true), + 'books' => array_slice($accessStats['books'], 0, 20, true), + 'as' => AsnLookup::aggregateByAs($topIps, $asnMap), + ]; + @file_put_contents($statsCacheFile, json_encode($statsRaw)); + } + $adminData['stats_readable'] = $statsRaw['readable']; + $adminData['stats_pages'] = $statsRaw['pages']; + $adminData['stats_books'] = $statsRaw['books']; + $adminData['stats_as'] = $statsRaw['as']; + $adminData['stats_as_groups'] = AsnLookup::applyGroups($statsRaw['as'], asGroups()); $adminData['as_groups'] = asGroups(); }