mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 19:19:19 +02:00
Status (services, PHP env, disk) is now always visible above the log/config tab bar rather than being one of the tab targets: - Status section rendered unconditionally above <nav class="sys-tabs">. - Services grid, PHP info grid and disk bar grouped inside a collapsible <section> with a header row containing the cache-freshness badge and a toggle button (▲ Réduire / ▼ Développer). - Collapse state persisted in localStorage so the preference survives page reloads (e.g. when switching log tabs). - Tab bar now only contains the three log tabs + nginx config; the 'Statut' tab is removed. Legacy ?tab=status URLs fall through to nginx_access. - PHP/disk sub-sections laid out in a 2-col grid inside the status panel; responsive single-col below 700px. - system.css: new .sys-status-section / .sys-status-header / .sys-status-toggle / .sys-status-meta rules added. - aria-current="page" added to active tab links. - todo/03-system-cache.md: all items marked done; notes added explaining why log caching was deliberately omitted.
1.9 KiB
1.9 KiB
System Page Caching - Database-Backed Status Cache
Problem
The admin system page (/admin/system.php) runs expensive operations on every load:
systemctlsubprocess calls (~4 checks × ~100ms each)curlHTTP self-check (~200-500ms)disk_total_space()/disk_free_space()(fast but unnecessary per-request)- Log file
tail+filesize+filemtime(I/O bound) - Nginx config file reading
Solution: system_cache table + background refresh
- Add
system_cachetable to schema:CREATE TABLE system_cache (key TEXT PRIMARY KEY, value TEXT NOT NULL, updated_at INTEGER NOT NULL) - Add migration
storage/migrations/007_system_cache.sql - Add
SystemCacheclass (src/SystemCache.php) with methods:get(string $key, int $maxAgeSec = 60): ?arrayset(string $key, array $data): voidisStale(string $key, int $maxAgeSec = 60): bool
- Refactor
system.phpstatus section:- Check
SystemCache::get('system_status', 120)— 2-minute TTL - If cache hit → render from cache, show “mis en cache il y a X sec” label
- If cache miss → run checks, store in cache, render
- Add
?refresh=1GET param to force-bypass cache
- Check
- Refactor
system.phplog sections — avoid re-reading on every tab switch; only read the active tab’s log - Cache disk info separately with 5-minute TTL:
SystemCache::get('disk_info', 300) - Cache PHP info separately with 1-hour TTL:
SystemCache::get('php_info', 3600)
Notes
- Log caching deliberately omitted:
tailoutput is inherently real-time and caching even 30s would show stale data during the moments it matters most (deploys, errors). The existing tab guard already ensures only the active log file is read. - nginx config could be cached but
file()on a small static config file is negligible; not worth the added complexity. - A future improvement could stream log tabs via
fetch()to avoid full-page reloads on tab switch.