$a['nom'], $donnees['archives'] ?? array()); } function Traiter_demande($id_bateau) { Ouverture_bdd("127.0.0.1:3307", BDD_USER, BDD_PASSWORD, BDD_DATABASE); $stmt = $_SESSION['db']->prepare("SELECT C.Adresse_netbird FROM TB_Affectations_bateaux A JOIN TB_Cartes C ON C.Adresse_mac = A.Adresse_mac WHERE A.ID_Bateau=? AND A.Date_fin IS NULL"); $stmt->bind_param('i', $id_bateau); $stmt->execute(); $ligne = $stmt->get_result()->fetch_row(); $stmt->close(); Fermeture_bdd(); $adresse = $ligne ? trim((string)$ligne[0]) : ''; if (filter_var($adresse, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) { echo "Bateau {$id_bateau} : aucun module joignable affecté - demande ignorée.\n"; return; } // 1. Archive immédiate (si le CM5 ne connaît pas encore cette route - ancienne version de l'API -, on se contente de // rapatrier ce qui est déjà en attente) : $avant = Noms_archives($adresse); if ($avant === null) { echo "Bateau {$id_bateau} : CM5 injoignable ({$adresse}) - demande abandonnée.\n"; return; } if (Appel_cm5($adresse, 'POST', '/archives/demande') === null) { echo "Bateau {$id_bateau} : demande d'archive immédiate refusée ou non prise en charge - rapatriement de l'existant.\n"; } else { // 2. Attente de la nouvelle archive : $nouvelle = false; for ($attente = 0; $attente < DELAI_ATTENTE_ARCHIVE && !$nouvelle; $attente += 2) { sleep(2); $apres = Noms_archives($adresse); if ($apres !== null && count(array_diff($apres, $avant)) > 0) $nouvelle = true; } echo "Bateau {$id_bateau} : ".($nouvelle ? "nouvelle archive produite." : "aucune nouvelle archive après ".DELAI_ATTENTE_ARCHIVE." s - rapatriement de l'existant.")."\n"; if ($nouvelle) sleep(DELAI_FIN_ECRITURE_ARCHIVE); } // 3. Traitement des archives de ce seul bateau : passthru("/usr/bin/php ".escapeshellarg(__DIR__."/cron_archivage.php")." --bateau=".(int)$id_bateau); } if (!is_dir(REPERTOIRE_DEMANDES_A_TRAITER)) { echo "Répertoire ".REPERTOIRE_DEMANDES_A_TRAITER." absent.\n"; exit(1); } // Toutes les demandes présentes (plusieurs bateaux possibles), chacune consommée AVANT son traitement : foreach (scandir(REPERTOIRE_DEMANDES_A_TRAITER) as $nom) { if ($nom === '.' || $nom === '..') continue; $chemin = REPERTOIRE_DEMANDES_A_TRAITER."/".$nom; @unlink($chemin); if (preg_match('/^[1-9][0-9]{0,9}$/', $nom) !== 1) { echo "Demande '{$nom}' invalide - supprimée.\n"; continue; } try { Traiter_demande((int)$nom); } catch (Throwable $e) { echo "Bateau {$nom} : erreur - ".$e->getMessage()."\n"; } // N'empêche pas les demandes suivantes }