From 3857efcf8432ffb3b7a0a88fa53735b521e1fa8d Mon Sep 17 00:00:00 2001 From: solocla Date: Thu, 29 Oct 2026 10:23:45 +0100 Subject: [PATCH] fixed warm cache --- .../class/VisualLimsApiClient.class.php | 21 ++++++++++++++++++- public/userarea/warm_cache.php | 10 +++++++++ public/userarea/warm_cache_run.php | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/public/userarea/class/VisualLimsApiClient.class.php b/public/userarea/class/VisualLimsApiClient.class.php index a040e851..e11eafce 100644 --- a/public/userarea/class/VisualLimsApiClient.class.php +++ b/public/userarea/class/VisualLimsApiClient.class.php @@ -55,6 +55,7 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch); curl_setopt($ch, CURLOPT_VERBOSE, true); $log = fopen(__DIR__ . '/curl_auth_debug.log', 'a') ?: fopen('php://stderr', 'w'); curl_setopt($ch, CURLOPT_STDERR, $log); @@ -91,6 +92,19 @@ class VisualLimsApiClient } } + /** + * Timeout di rete: evita che una richiesta resti appesa all'infinito + * se il gestionale smette di rispondere (connessione "morta"). + * $idleSeconds = secondi senza trasferire dati prima di abbandonare. + */ + private function applyTimeouts($ch, $idleSeconds = 120) + { + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); + curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, 1); + curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1); + curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, $idleSeconds); + } + private function getToken() { if ($this->token === null) { @@ -113,6 +127,7 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch); curl_setopt($ch, CURLOPT_VERBOSE, true); $log = fopen(__DIR__ . '/curl_request_debug.log', 'w') ?: fopen('php://stderr', 'w'); curl_setopt($ch, CURLOPT_STDERR, $log); @@ -156,6 +171,7 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch, 300); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); @@ -190,6 +206,7 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch, 300); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); @@ -239,8 +256,9 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch, 300); - $response = curl_exec($ch); + $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curl_error = curl_error($ch); curl_close($ch); @@ -280,6 +298,7 @@ class VisualLimsApiClient ]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $this->applyTimeouts($ch, 300); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); diff --git a/public/userarea/warm_cache.php b/public/userarea/warm_cache.php index 7db959f6..3c7955bb 100644 --- a/public/userarea/warm_cache.php +++ b/public/userarea/warm_cache.php @@ -21,6 +21,10 @@ if (!$isCli) { exit; } + // Libera subito la sessione: il warm dura minuti e altrimenti blocca + // tutte le altre pagine dello stesso utente fino alla fine. + session_write_close(); + if ($isStream) { // Streaming mode: send progress line-by-line (Server-Sent Events) set_time_limit(0); @@ -160,6 +164,7 @@ try { $matriceIds = $stmt->fetchAll(PDO::FETCH_COLUMN); warmLog("[analisi] Fetching for " . count($matriceIds) . " matrici in use...", $isCli); + $consecutiveErrors = 0; foreach ($matriceIds as $mid) { $mid = (int)$mid; // Same query as get_analisi_matrice_filter.php with web_only=1 (what the analysis modal requests) @@ -169,8 +174,13 @@ try { $values = $data['value'] ?? []; file_put_contents($cacheDir . '/analisi_matrice_' . $mid . '.json', json_encode(['value' => $values])); warmLog("[analisi] Matrice $mid: " . count($values) . " analisi", $isCli); + $consecutiveErrors = 0; } catch (Exception $e) { warmLog("[analisi] Matrice $mid: ERROR " . $e->getMessage(), $isCli); + if (++$consecutiveErrors >= 5) { + warmLog("[analisi] ERRORE: gestionale non raggiungibile (5 errori consecutivi), interrompo le analisi.", $isCli); + break; + } } } } // fine if includeAnalisi diff --git a/public/userarea/warm_cache_run.php b/public/userarea/warm_cache_run.php index d9953d97..fc02071a 100644 --- a/public/userarea/warm_cache_run.php +++ b/public/userarea/warm_cache_run.php @@ -195,7 +195,7 @@ include('include/headscript.php'); Avvia aggiornamento
- L'operazione può richiedere da qualche secondo a un paio di minuti. + Senza analisi richiede circa un minuto, con le analisi fino a 30 minuti. Puoi lasciare questa pagina aperta e continuare a lavorare in un'altra scheda.