aboutsummaryrefslogtreecommitdiff
path: root/src/service/Backup.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-05-10 13:50:30 +0200
committerpolo <ordipolo@gmx.fr>2026-05-10 13:50:30 +0200
commit2c47085b27253c4ad2d062d15c18c3a8c7591298 (patch)
tree096ca9bd97ee65550315bfae45ae1d79bbc70aab /src/service/Backup.php
parent7d501b325f0389e53bf07ffb76718dcbc1b34c93 (diff)
downloadcms-2c47085b27253c4ad2d062d15c18c3a8c7591298.tar.gz
cms-2c47085b27253c4ad2d062d15c18c3a8c7591298.tar.bz2
cms-2c47085b27253c4ad2d062d15c18c3a8c7591298.zip
mysqldump, téléchargement d'un .sql et stockage des sauvegardes dans /var/backups
Diffstat (limited to 'src/service/Backup.php')
-rw-r--r--src/service/Backup.php70
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
4declare(strict_types=1);
5
6use Doctrine\ORM\EntityManager;
7use Symfony\Component\Process\Process; // protection injection dans le shell
8
9class 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