/dev/null"; exec($command); logOperation("Tunnel SSH fermé", "INFO"); } /** * Fonction utilitaire pour se connecter à la base de données source via SSH */ function getSourceConnection() { try { // Établir le tunnel SSH if (!createSshTunnel()) { throw new PDOException("Impossible d'établir le tunnel SSH"); } // Options de connexion PDO $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4' ]; // Ajouter l'option pour MySQL 8 if (defined('PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT')) { $options[PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = false; } try { // D'abord vérifier si la base existe $tempDsn = 'mysql:host=' . SOURCE_DB_HOST . ';port=' . SOURCE_DB_PORT; $tempPdo = new PDO($tempDsn, SOURCE_DB_USER, SOURCE_DB_PASS, $options); $stmt = $tempPdo->query("SHOW DATABASES"); $databases = $stmt->fetchAll(PDO::FETCH_COLUMN); if (!in_array(SOURCE_DB_NAME, $databases)) { logOperation("Base de données '" . SOURCE_DB_NAME . "' introuvable. Bases disponibles: " . implode(", ", $databases), "ERROR"); throw new PDOException("Base de données '" . SOURCE_DB_NAME . "' introuvable"); } // Se connecter à la base spécifique $dsn = 'mysql:host=' . SOURCE_DB_HOST . ';dbname=' . SOURCE_DB_NAME . ';port=' . SOURCE_DB_PORT; $pdo = new PDO($dsn, SOURCE_DB_USER, SOURCE_DB_PASS, $options); logOperation("Connexion établie à la base '" . SOURCE_DB_NAME . "'", "INFO"); return $pdo; } catch (PDOException $e) { logOperation("Erreur de connexion: " . $e->getMessage(), "ERROR"); throw $e; } } catch (PDOException $e) { closeSshTunnel(); throw new Exception("Erreur de connexion à la base source: " . $e->getMessage()); } } /** * Fonction utilitaire pour se connecter à la base de données cible */ function getTargetConnection() { try { $dsn = 'mysql:host=' . TARGET_DB_HOST . ';dbname=' . TARGET_DB_NAME . ';port=' . TARGET_DB_PORT; $pdo = new PDO($dsn, TARGET_DB_USER, TARGET_DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4' ]); return $pdo; } catch (PDOException $e) { die('Erreur de connexion à la base cible: ' . $e->getMessage()); } } /** * Fonction pour journaliser les opérations */ function logOperation($message, $level = 'INFO') { $logFile = __DIR__ . '/logs/migration_' . date('Y-m-d') . '.log'; $logDir = dirname($logFile); if (!is_dir($logDir)) { mkdir($logDir, 0755, true); } $timestamp = date('Y-m-d H:i:s'); $logMessage = "[$timestamp] [$level] $message" . PHP_EOL; file_put_contents($logFile, $logMessage, FILE_APPEND); if (php_sapi_name() === 'cli') { echo $logMessage; } }