perf : cache 60 s pour les stats admin (logs Apache + lookup ASN)
Les données coûteuses (parsing des logs, batchLookup ASN) sont mises en cache dans DATA_PATH/.stats_cache.json. Le cache expire après 60 secondes via filemtime. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+20
-7
@@ -2551,17 +2551,30 @@ switch ($action) {
|
||||
}
|
||||
require_once BASE_PATH . '/src/AccessLogParser.php';
|
||||
require_once BASE_PATH . '/src/AsnLookup.php';
|
||||
|
||||
$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();
|
||||
$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());
|
||||
$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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user