feat(admin): add transparent debug error-log mode

Add an admin-controlled debug mode that captures PHP errors of all
players into var/log/debug-players.log, to hunt remaining PHP 8.3 bugs
from real play sessions. Fully transparent to players: no redirect, no
gameplay change, errors are never displayed.

- DB: new debug_log table (one row), mirroring the maintenance pattern.
- Database: getDebugMode()/setDebugMode()/setDebugSettings(), defensive
  when the table is absent (no blank page).
- Session: register a custom error + shutdown handler when enabled; the
  handler runs even when php.ini error_reporting masks warnings/notices,
  so capture is complete without a Docker rebuild. Auto-disables after a
  configurable window.
- DebugErrorLogger: size-capped file with a single .log.1 rotation,
  honours the @ operator, never throws.
- Admin: new "Debug Error Log" page (levels, size cap, auto-off, on-page
  viewer, clear, download) + debugLog action mod.
- Menu: admin-only quick on/off widget (TZ_DEBUG_ON/OFF, EN/FR/RO).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ferywir
2026-06-12 15:25:57 +02:00
committed by Catalin Novgorodschi
parent 63c94fa961
commit 827354a622
12 changed files with 563 additions and 3 deletions
+15
View File
@@ -129,6 +129,21 @@ function __construct() {
}
}
// === DEBUG ERROR LOG (admin-controlled, transparent to players) ===
// When enabled from the admin panel, capture the selected PHP errors of
// every player into var/log/debug-players.log. Auto-disables itself after
// the configured window so a forgotten debug session cannot run forever.
$dbg = $database->getDebugMode();
if (!empty($dbg['active'])) {
$autoOff = (int)($dbg['auto_off_hours'] ?? 0);
if ($autoOff > 0 && !empty($dbg['started_at'])
&& ($dbg['started_at'] + $autoOff * 3600) < $this->time) {
$database->setDebugMode(0, $this->uid ?? 0);
} else {
\App\Utils\DebugErrorLogger::enable($dbg, $this->uid ?? 0, $this->username ?? '');
}
}
$this->referrer = $_SESSION['url'] ?? "/";
$this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];