diff options
Diffstat (limited to 'src/service/Backup.php')
| -rw-r--r-- | src/service/Backup.php | 70 |
1 files changed, 70 insertions, 0 deletions
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 @@ | |||
| 1 | <?php | ||
| 2 | // src/service/Backup.php | ||
| 3 | |||
| 4 | declare(strict_types=1); | ||
| 5 | |||
| 6 | use Doctrine\ORM\EntityManager; | ||
| 7 | use Symfony\Component\Process\Process; // protection injection dans le shell | ||
| 8 | |||
| 9 | class Backup | ||
| 10 | { | ||
| 11 | static private string $backup_dir = '../var/backups'; | ||
| 12 | static private int $amount_to_keep = 30; | ||
| 13 | |||
| 14 | static public function mySQLdump(EntityManager $entityManager): string | ||
| 15 | { | ||
| 16 | $file_path = self::$backup_dir . '/db_' . Config::$database . '_' . new DateTime()->format('Y-m-d') . '.sql'; | ||
| 17 | |||
| 18 | // les versions de mysql sont comme ci: 8.0.36 | ||
| 19 | // celles de mariadb sont comme ça: 10.11.6-MariaDB | ||
| 20 | $version = $entityManager->getConnection()->fetchOne('SELECT VERSION()'); | ||
| 21 | $engine = stripos($version, 'mariadb') !== false ? 'mariadb-dump' : 'mysqldump'; | ||
| 22 | |||
| 23 | $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) | ||
| 24 | file_put_contents($tmp, | ||
| 25 | "[client]\n | ||
| 26 | user=" . Config::$user . "\n | ||
| 27 | password=" . Config::$password . "\n | ||
| 28 | host=" . Config::$db_host . "\n"); | ||
| 29 | |||
| 30 | $command = new Process([ | ||
| 31 | $engine, | ||
| 32 | '--defaults-extra-file=' . $tmp, // pour ne pas enregistrer les codes dans l'historique de la console ou dans les processus de l'OS | ||
| 33 | '--single-transaction', | ||
| 34 | '--quick', // évite d'exploser la RAM si beaucoup de données | ||
| 35 | '--result-file=' . $file_path, | ||
| 36 | Config::$database | ||
| 37 | ]); | ||
| 38 | |||
| 39 | try{ | ||
| 40 | $command->mustRun(); // comme run() mais lance une ProcessFailedException | ||
| 41 | return $file_path; | ||
| 42 | } | ||
| 43 | finally{ | ||
| 44 | // exécuté même quand situé après "return" | ||
| 45 | unlink($tmp); | ||
| 46 | self::cleanBackups(); | ||
| 47 | } | ||
| 48 | |||
| 49 | // compression gzip (gros gain de place sur le serveur), nécessite l'extension zlib | ||
| 50 | /*try{ | ||
| 51 | file_put_contents( | ||
| 52 | $file_path . '.gz', | ||
| 53 | gzencode(file_get_contents($file_path), 5), // plus rapide que 9 et taille identique d'après mes essais | ||
| 54 | ); | ||
| 55 | return $file_path . '.gz'; | ||
| 56 | } | ||
| 57 | finally{ | ||
| 58 | unlink($file_path); | ||
| 59 | }*/ | ||
| 60 | } | ||
| 61 | |||
| 62 | static public function cleanBackups(): void { | ||
| 63 | $files = glob(self::$backup_dir . '/*.sql'); | ||
| 64 | usort($files, fn($a, $b) => filemtime($b) <=> filemtime($a)); // filemtime = date de dernière modification | ||
| 65 | $files_to_delete = array_slice($files, self::$amount_to_keep); | ||
| 66 | foreach($files_to_delete as $file){ | ||
| 67 | unlink($file); | ||
| 68 | } | ||
| 69 | } | ||
| 70 | } \ No newline at end of file | ||
