V2 : optimisation API (cache, index, vue materialisee)

- BDD (migrations 1.6.0 + 1.7.0, idempotentes) :
  * 4 nouveaux index composites sur reactevents, triggerevents, sessions
  * vue sessiondebriefs reecrite (sous-requetes correlees -> JOINs)
    puis materialisee dans table session_debriefs_cache via procedure
    stockee rebuild_debrief_cache, recalculee uniquement aux changements
  * fix bug double JOIN participates : TargetRole = "IA" pour les hits
    NPC/objets (au lieu d'un role aleatoire de participant)
- API PHP :
  * connexion PDO en singleton + ATTR_PERSISTENT
  * cache disque par session (cache/sess_<id>/) pour debrief, get, userhistory
    avec invalidation ciblee sur events et lifecycle
  * pagination opt-in (limit/offset) sur lists/sessions_for_user
  * helpers ensure_/rebuild_/invalidate_session_debrief_cache_db
  * debug/benchmark.php pour mesurer la latence des 6 endpoints cles
- Endpoints HTTP : signatures inchangees, compat Unreal preservee
- Gain mesure : -58% a -83% sur les 5 endpoints cles

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-04 16:41:52 +02:00
parent 97b980a05a
commit 68cea1eb4d
20 changed files with 757 additions and 45 deletions

View File

@@ -6,9 +6,13 @@ include_once '../objects/stats_object.php';
$userId = isset($_POST['userId']) ? $_POST['userId'] : -1;
$typeId = isset($_POST['typeId']) ? $_POST['typeId'] : -1;
// Optional pagination : Unreal n'envoie pas ces champs (comportement legacy preserve),
// le futur web UI peut les passer pour ne pas charger toutes les sessions d'un coup.
$limit = isset($_POST['limit']) ? intval($_POST['limit']) : -1;
$offset = isset($_POST['offset']) ? intval($_POST['offset']) : 0;
$stats = new StatsObject($db);
$stats->getSessionsForUser($userId, $typeId);
$stats->getSessionsForUser($userId, $typeId, $limit, $offset);
$stats_arr = $stats->getResultArray(true, "User_Sessions_List_OK");
print_r(json_encode($stats_arr)); // OK