Sfoglia il codice sorgente

fix the latence error

gdias 1 settimana fa
parent
commit
14688dd81c
2 ha cambiato i file con 28 aggiunte e 2 eliminazioni
  1. 27 2
      libs/Database.php
  2. 1 0
      log.txt

+ 27 - 2
libs/Database.php

@@ -14,14 +14,34 @@ namespace Libs;
 final class Database
 {
     private static ?\PDO $connection = null;
+    private static float $lastCheckedAt = 0.0;
+
+    /**
+     * Intervalo mínimo entre validações de "liveness" da conexão.
+     * Dentro de uma mesma requisição (que faz várias queries em sequência),
+     * evita repetir o round-trip de "SELECT 1" a cada chamada de pdo().
+     */
+    private const HEALTHCHECK_INTERVAL_SECONDS = 2.0;
 
     public static function pdo(): \PDO
     {
-        if (self::$connection instanceof \PDO && self::isAlive(self::$connection)) {
-            return self::$connection;
+        if (self::$connection instanceof \PDO) {
+            $now = microtime(true);
+
+            // Só revalida a conexão se passou o intervalo mínimo desde a
+            // última checagem; caso contrário reaproveita direto.
+            if ($now - self::$lastCheckedAt < self::HEALTHCHECK_INTERVAL_SECONDS) {
+                return self::$connection;
+            }
+
+            if (self::isAlive(self::$connection)) {
+                self::$lastCheckedAt = $now;
+                return self::$connection;
+            }
         }
 
         self::$connection = self::connect();
+        self::$lastCheckedAt = microtime(true);
 
         return self::$connection;
     }
@@ -65,6 +85,11 @@ final class Database
                 \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                 \PDO::ATTR_PERSISTENT => true,
+                // Emula prepares no cliente: evita o round-trip extra de
+                // Parse/Describe server-side a cada query. Com o banco remoto
+                // (~160ms de latência por ida-e-volta), isso reduz o custo de
+                // cada query de ~3 round-trips para 1.
+                \PDO::ATTR_EMULATE_PREPARES => true,
             ]);
         } catch (\PDOException $e) {
             Logger::error('Failed to connect to database', [

+ 1 - 0
log.txt

@@ -4,3 +4,4 @@
 [2026-06-09 21:05:50] INFO: Database connection established {"host":"51.79.79.8","port":"15432","name":"nettown_db"}
 [2026-06-09 21:07:57] WARNING: JWT authentication failed {"error":"Expired token"}
 [2026-06-09 21:31:16] INFO: Database connection established {"host":"51.79.79.8","port":"15432","name":"nettown_db"}
+[2026-06-09 21:51:23] INFO: Database connection established {"host":"51.79.79.8","port":"15432","name":"nettown_db"}