Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions lang/de_de.lang
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ statistics_delete_bots = Alle Bots löschen
statistics_delete_referer = Alle Verweise löschen
statistics_delete_media = Alle Media-Statistik löschen
statistics_delete_noise = Störanfragen bereinigen
statistics_delete_non200_urls = Nicht-200-URLs bereinigen
statistics_delete_old = Alte Statistikdaten bereinigen
statistics_delete_since_date = Daten ab Stichtag löschen
statistics_delete_raw_old = Alte Rohdaten bereinigen
statistics_maintenance_delete_heading = Löschaktionen
statistics_maintenance_delete_note = Dieser Bereich entfernt Daten dauerhaft. Bitte vor größeren Löschungen Sicherungen prüfen.
Expand All @@ -84,7 +86,9 @@ statistics_maintenance_scope_referer = Betroffene Daten: Referer-Statistik
statistics_maintenance_scope_media = Betroffene Daten: Media-Statistik
statistics_maintenance_scope_api = Betroffene Daten: API-/Kampagnen-Statistik
statistics_maintenance_scope_noise = Betroffene Daten: Typische Probe-/Störanfragen
statistics_maintenance_scope_non200_urls = Betroffene Daten: URL-basierte Statistik für derzeitige Nicht-200-URLs (Näherungswert)
statistics_maintenance_scope_keep_days = Betroffene Daten: Einträge älter als die angegebene Tageszahl
statistics_maintenance_scope_since_date = Betroffene Daten: Einträge ab dem gewählten Stichtag
statistics_maintenance_scope_keep_days_raw = Betroffene Daten: Rohdaten älter als die angegebene Tageszahl
statistics_maintenance_scope_optimize = Betroffene Daten: Tabellenstruktur und Speicherbelegung
statistics_geo_status = Geo-Datenbank Status
Expand All @@ -94,7 +98,9 @@ statistics_geo_status_not_available = nicht verfügbar
statistics_geo_last_update = Letzte Aktualisierung
statistics_geo_file_size = Dateigröße
statistics_cleanup_keep_days = Tage behalten:
statistics_cleanup_since_date = Stichtag:
statistics_cleanup_keep_days_raw = Rohdaten behalten (Tage):
statistics_cleanup_since_date_invalid = Ungültiges Stichtagsdatum. Bitte das Format JJJJ-MM-TT verwenden.
statistics_monday = Montag
statistics_tuesday = Dienstag
statistics_wednesday = Mittwoch
Expand All @@ -108,7 +114,9 @@ statistics_confirm_delete_bots = Wirklich alle Besuche von Bots löschen?
statistics_confirm_delete_referer = Wirklich alle Referer löschen?
statistics_confirm_delete_media = Wirklich die gesamte Media-Statistik löschen?
statistics_confirm_delete_noise = Wirklich typische Probe- und WordPress-Anfragen aus den Statistiken löschen?
statistics_confirm_delete_non200_urls = Wirklich URL-basierte Statistikdaten für aktuell als Nicht-200 erkannte URLs bereinigen?
statistics_confirm_delete_old = Wirklich alle Statistikdaten löschen, die älter als die angegebene Anzahl Tage sind?
statistics_confirm_delete_since_date = Wirklich alle Statistikdaten ab dem gewählten Stichtag löschen?
statistics_confirm_delete_raw_old = Wirklich alte Rohdaten löschen? Tagesstatistiken bleiben erhalten.
statistics_confirm_optimize_tables = Statistik-Tabellen jetzt optimieren? Das kann bei großen Tabellen etwas dauern.
statistics_deleted_hashes = Einträge aus der Tabelle hashes gelöscht.
Expand All @@ -121,7 +129,9 @@ statistics_geo_update_success = Geo-Datenbank aktualisiert.
statistics_geo_update_error = Geo-Datenbank konnte nicht aktualisiert werden.
statistics_deleted_noise = Es wurden %s Störanfragen gelöscht.
statistics_deleted_noise_partial = Es wurden %s Störanfragen in diesem Lauf bereinigt. Für den Rest bitte den Vorgang erneut starten.
statistics_deleted_non200_urls = Es wurden %s URL-basierte Einträge für Nicht-200-URLs bereinigt.
statistics_deleted_old = Es wurden %s alte Einträge gelöscht (älter als %s Tage).
statistics_deleted_since_date = Es wurden %s Einträge ab dem Stichtag %s gelöscht.
statistics_deleted_raw_old = Es wurden %s alte Rohdaten-Einträge gelöscht (älter als %s Tage).
statistics_batch_continue = Nächsten Batch ausführen
statistics_batch_more_data = Dieser Vorgang läuft batchweise. Bitte den nächsten Batch starten, um weitere Datensätze zu verarbeiten.
Expand Down
10 changes: 10 additions & 0 deletions lang/en_gb.lang
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ statistics_delete_bots = Delete all bots
statistics_delete_referer = Delete all referers
statistics_delete_media = Delete all media statistics
statistics_delete_noise = Clean noise requests
statistics_delete_non200_urls = Clean non-200 URLs
statistics_delete_old = Cleanup old statistics data
statistics_delete_since_date = Delete data from date
statistics_delete_raw_old = Cleanup old raw data
statistics_maintenance_delete_heading = Deletion actions
statistics_maintenance_delete_note = This section permanently removes data. Please verify backups before larger deletions.
Expand All @@ -86,7 +88,9 @@ statistics_maintenance_scope_referer = Affected data: referer statistics
statistics_maintenance_scope_media = Affected data: media statistics
statistics_maintenance_scope_api = Affected data: API/campaign statistics
statistics_maintenance_scope_noise = Affected data: common probe/noise requests
statistics_maintenance_scope_non200_urls = Affected data: URL-based statistics for currently non-200 URLs (approximation)
statistics_maintenance_scope_keep_days = Affected data: entries older than the configured number of days
statistics_maintenance_scope_since_date = Affected data: entries from the selected cutoff date
statistics_maintenance_scope_keep_days_raw = Affected data: raw data older than the configured number of days
statistics_maintenance_scope_optimize = Affected data: table structure and storage allocation
statistics_geo_status = Geo database status
Expand All @@ -96,7 +100,9 @@ statistics_geo_status_not_available = not available
statistics_geo_last_update = Last update
statistics_geo_file_size = File size
statistics_cleanup_keep_days = Keep days:
statistics_cleanup_since_date = Cutoff date:
statistics_cleanup_keep_days_raw = Keep raw data (days):
statistics_cleanup_since_date_invalid = Invalid cutoff date. Please use format YYYY-MM-DD.
statistics_monday = Monday
statistics_tuesday = Tuesday
statistics_wednesday = Wednesday
Expand All @@ -110,7 +116,9 @@ statistics_confirm_delete_bots = Really delete all visits from bots?
statistics_confirm_delete_referer = Really delete all referers?
statistics_confirm_delete_media = Really delete all media statistics?
statistics_confirm_delete_noise = Really delete typical probe and WordPress requests from statistics?
statistics_confirm_delete_non200_urls = Really clean URL-based statistics for URLs currently recognized as non-200?
statistics_confirm_delete_old = Really delete all statistics data older than the entered number of days?
statistics_confirm_delete_since_date = Really delete all statistics data from the selected cutoff date onward?
statistics_confirm_delete_raw_old = Really delete old raw data? Daily statistics will be kept.
statistics_confirm_optimize_tables = Optimize statistics tables now? This can take some time on large tables.
statistics_deleted_hashes = entries deleted from the hashes table.
Expand All @@ -123,7 +131,9 @@ statistics_geo_update_success = Geo database updated.
statistics_geo_update_error = Geo database could not be updated.
statistics_deleted_noise = %s noise requests were deleted.
statistics_deleted_noise_partial = %s noise requests were cleaned in this run. Please run it again to continue.
statistics_deleted_non200_urls = %s URL-based entries for non-200 URLs were cleaned.
statistics_deleted_old = %s old entries were deleted (older than %s days).
statistics_deleted_since_date = %s entries were deleted from cutoff date %s onward.
statistics_deleted_raw_old = %s old raw-data entries were deleted (older than %s days).
statistics_batch_continue = Run next batch
statistics_batch_more_data = This operation runs in batches. Please start the next batch to process remaining records.
Expand Down
125 changes: 73 additions & 52 deletions lib/StatisticsMaintenanceCronjob.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,71 +18,92 @@ public function execute(): bool
$cutoffDatetime = $cutoffDate . ' 00:00:00';

$deleted = 0;
$previousRuntimePause = (bool) rex_config::get('statistics', 'statistics_pause_tracking_runtime', false);
$previousRuntimePause = false;
$runtimePauseActive = false;

if ($pauseTrackingDuringMaintenance) {
rex_config::set('statistics', 'statistics_pause_tracking_runtime', true);
try {
$previousRuntimePause = (bool) rex_config::get('statistics', 'statistics_pause_tracking_runtime', false);
rex_config::set('statistics', 'statistics_pause_tracking_runtime', true);
$runtimePauseActive = true;
} catch (\Throwable $exception) {
rex_logger::logException($exception);
$this->setMessage('Statistics-Wartung fehlgeschlagen: Tracking-Pause konnte nicht gesetzt werden: ' . $exception->getMessage());

return false;
}
}

$result = false;
$message = '';

try {
try {
$deleted += $this->deleteChunked(rex::getTable('pagestats_visits_per_url'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_visitors_per_url'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_referer'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_media'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_api'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_sessionstats'), 'lastvisit < :cutoff_datetime', [':cutoff_datetime' => $cutoffDatetime]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_hash'), 'datetime < :cutoff_datetime', [':cutoff_datetime' => $cutoffDatetime]);

$deleted += $this->deleteOrphanUrlStatusChunked();

$noiseDeleted = 0;
$noiseHasMore = false;
if ($cleanupNoise) {
$noiseResult = $this->cleanupNoiseBatch();
$noiseDeleted = $noiseResult['deleted'];
$noiseHasMore = $noiseResult['has_more'];
$deleted += $noiseDeleted;
}
$deleted += $this->deleteChunked(rex::getTable('pagestats_visits_per_url'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_visitors_per_url'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_referer'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_media'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_api'), 'date < :cutoff_date', [':cutoff_date' => $cutoffDate]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_sessionstats'), 'lastvisit < :cutoff_datetime', [':cutoff_datetime' => $cutoffDatetime]);
$deleted += $this->deleteChunked(rex::getTable('pagestats_hash'), 'datetime < :cutoff_datetime', [':cutoff_datetime' => $cutoffDatetime]);

$deleted += $this->deleteOrphanUrlStatusChunked();

$noiseDeleted = 0;
$noiseHasMore = false;
if ($cleanupNoise) {
$noiseResult = $this->cleanupNoiseBatch();
$noiseDeleted = $noiseResult['deleted'];
$noiseHasMore = $noiseResult['has_more'];
$deleted += $noiseDeleted;
}

$optimized = 0;
$optimizedTotal = 0;
$optimizedRemaining = 0;
if ($optimizeTables) {
$optimizeResult = $this->optimizeTablesBatch($this->getTablesToOptimize(), $optimizeBatchSize);
$optimized = $optimizeResult['optimized'];
$optimizedTotal = $optimizeResult['total'];
$optimizedRemaining = $optimizeResult['remaining'];
}
$optimized = 0;
$optimizedTotal = 0;
$optimizedRemaining = 0;
if ($optimizeTables) {
$optimizeResult = $this->optimizeTablesBatch($this->getTablesToOptimize(), $optimizeBatchSize);
$optimized = $optimizeResult['optimized'];
$optimizedTotal = $optimizeResult['total'];
$optimizedRemaining = $optimizeResult['remaining'];
}

$message = 'Statistics-Wartung: ' . $deleted . ' Rohdaten-Einträge bereinigt (älter als ' . $daysToKeepRaw . ' Tage)';
if ($cleanupNoise) {
$message .= ', ' . $noiseDeleted . ' Störanfragen bereinigt';
if ($noiseHasMore) {
$message .= ' (weitere vorhanden)';
}
}
if ($optimizeTables) {
$message .= ', ' . $optimized . ' Tabellen optimiert (Batchgröße: ' . $optimizeBatchSize . ')';
if ($optimizedTotal > 0) {
$message .= ', verbleibend bis Vollzyklus: ' . $optimizedRemaining . ' von ' . $optimizedTotal;
}
$message = 'Statistics-Wartung: ' . $deleted . ' Rohdaten-Einträge bereinigt (älter als ' . $daysToKeepRaw . ' Tage)';
if ($cleanupNoise) {
$message .= ', ' . $noiseDeleted . ' Störanfragen bereinigt';
if ($noiseHasMore) {
$message .= ' (weitere vorhanden)';
}
if ($this->deferredDeleteBatches > 0) {
$message .= ', ' . $this->deferredDeleteBatches . ' Lösch-Batches wegen DB-Locks vertagt';
}
if ($optimizeTables) {
$message .= ', ' . $optimized . ' Tabellen optimiert (Batchgröße: ' . $optimizeBatchSize . ')';
if ($optimizedTotal > 0) {
$message .= ', verbleibend bis Vollzyklus: ' . $optimizedRemaining . ' von ' . $optimizedTotal;
}
$this->setMessage($message);
}
if ($this->deferredDeleteBatches > 0) {
$message .= ', ' . $this->deferredDeleteBatches . ' Lösch-Batches wegen DB-Locks vertagt';
}

return true;
} catch (rex_sql_exception $exception) {
$this->setMessage('Statistics-Wartung fehlgeschlagen: ' . $exception->getMessage());
$result = true;
} catch (rex_sql_exception $exception) {
$message = 'Statistics-Wartung fehlgeschlagen: ' . $exception->getMessage();
$result = false;
}

return false;
}
} finally {
if ($pauseTrackingDuringMaintenance) {
if ($runtimePauseActive) {
try {
rex_config::set('statistics', 'statistics_pause_tracking_runtime', $previousRuntimePause);
} catch (\Throwable $exception) {
rex_logger::logException($exception);
$this->setMessage('Statistics-Wartung fehlgeschlagen: Tracking-Pause konnte nicht zurückgesetzt werden: ' . $exception->getMessage());

return false;
}
}

$this->setMessage($message);

return $result;
}

public function getTypeName(): string
Expand Down
Loading