From 2c47085b27253c4ad2d062d15c18c3a8c7591298 Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 10 May 2026 13:50:30 +0200 Subject: =?UTF-8?q?mysqldump,=20t=C3=A9l=C3=A9chargement=20d'un=20.sql=20e?= =?UTF-8?q?t=20stockage=20des=20sauvegardes=20dans=20/var/backups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/Backup.php | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/service/Backup.php (limited to 'src/service/Backup.php') diff --git a/src/service/Backup.php b/src/service/Backup.php new file mode 100644 index 0000000..d628c27 --- /dev/null +++ b/src/service/Backup.php @@ -0,0 +1,70 @@ +format('Y-m-d') . '.sql'; + + // les versions de mysql sont comme ci: 8.0.36 + // celles de mariadb sont comme ça: 10.11.6-MariaDB + $version = $entityManager->getConnection()->fetchOne('SELECT VERSION()'); + $engine = stripos($version, 'mariadb') !== false ? 'mariadb-dump' : 'mysqldump'; + + $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) + file_put_contents($tmp, + "[client]\n + user=" . Config::$user . "\n + password=" . Config::$password . "\n + host=" . Config::$db_host . "\n"); + + $command = new Process([ + $engine, + '--defaults-extra-file=' . $tmp, // pour ne pas enregistrer les codes dans l'historique de la console ou dans les processus de l'OS + '--single-transaction', + '--quick', // évite d'exploser la RAM si beaucoup de données + '--result-file=' . $file_path, + Config::$database + ]); + + try{ + $command->mustRun(); // comme run() mais lance une ProcessFailedException + return $file_path; + } + finally{ + // exécuté même quand situé après "return" + unlink($tmp); + self::cleanBackups(); + } + + // compression gzip (gros gain de place sur le serveur), nécessite l'extension zlib + /*try{ + file_put_contents( + $file_path . '.gz', + gzencode(file_get_contents($file_path), 5), // plus rapide que 9 et taille identique d'après mes essais + ); + return $file_path . '.gz'; + } + finally{ + unlink($file_path); + }*/ + } + + static public function cleanBackups(): void { + $files = glob(self::$backup_dir . '/*.sql'); + usort($files, fn($a, $b) => filemtime($b) <=> filemtime($a)); // filemtime = date de dernière modification + $files_to_delete = array_slice($files, self::$amount_to_keep); + foreach($files_to_delete as $file){ + unlink($file); + } + } +} \ No newline at end of file -- cgit v1.2.3