backup.class.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. /**
  3. * Classe `backup`
  4. *
  5. * Cette classe gère les opérations de sauvegarde et de restauration des données.
  6. *
  7. * Fonctionnalités principales :
  8. * - Création de sauvegardes incluant la base de données et les fichiers.
  9. * - Restauration des sauvegardes à partir de fichiers ZIP.
  10. * - Gestion des fichiers de sauvegarde (scan, suppression, récupération du dernier fichier).
  11. *
  12. * @package Core\Class
  13. */
  14. class backup
  15. {
  16. /**
  17. * Crée un fichier de sauvegarde (backup) contenant la base de données et les fichiers.
  18. *
  19. * @return bool TRUE si la sauvegarde a été créée avec succès, FALSE en cas d'erreur.
  20. */
  21. public static function create()
  22. {
  23. try {
  24. $nameNewFolder = date("Ymd-His");
  25. $newFolder = DIR_TEMP . $nameNewFolder;
  26. mkdir($newFolder, 0777);
  27. self::dumpMysql($newFolder);
  28. file::copyFolder(DIR_DATAS, $newFolder . "/datas");
  29. $localZip = file::zip($newFolder, DIR_TEMP . $nameNewFolder);
  30. file::deleteFolder($newFolder);
  31. rename($localZip, DIR_BACKUP . $nameNewFolder . ".zip");
  32. alert::recSuccess("BackUp OK :. " . $nameNewFolder . ".zip");
  33. return TRUE;
  34. } catch (Exception $ex) {
  35. alert::recError("BackUp :. Erreur lors de la création");
  36. return FALSE;
  37. }
  38. }
  39. /**
  40. * Restaure un fichier de sauvegarde (backup).
  41. *
  42. * @param string $_zip Le chemin du fichier ZIP à restaurer.
  43. * @return bool TRUE si la restauration a réussi, FALSE en cas d'erreur.
  44. */
  45. public static function restore(string $_zip)
  46. {
  47. $tmpZip = str_replace(DIR_BACKUP, DIR_TEMP, $_zip);
  48. $tmpDatas = date("Ymd-His") . "-datas";
  49. copy($_zip, $tmpZip);
  50. $folder = file::unzip($tmpZip, DIR_TEMP);
  51. if(self::dumpMysqlRestore(DIR_TEMP . $folder . "/" . DB_NAME . ".Mysql")){
  52. rename(DIR_DATAS, DIR_TEMP . $tmpDatas);
  53. file::copyFolder(DIR_TEMP . $folder . "/datas", DIR_DATAS);
  54. if(is_dir(DIR_DATAS)){
  55. file::deleteFolder(DIR_TEMP . $tmpDatas);
  56. unlink($tmpZip);
  57. file::deleteFolder(DIR_TEMP . $folder);
  58. $zipInfo = pathinfo($_zip);
  59. alert::recSuccess("Restauration du backUp OK :. " . $zipInfo["filename"] . ".zip");
  60. return TRUE;
  61. }
  62. }
  63. alert::recError("Restauration du backUp :. Erreur lors du backup");
  64. return FALSE;
  65. }
  66. /**
  67. * Crée un dump de la base de données MySQL.
  68. *
  69. * @param string $_dir Le répertoire où le dump sera enregistré.
  70. * @return string|bool Le nom du fichier de dump ou FALSE en cas d'erreur.
  71. */
  72. public static function dumpMysql(string $_dir)
  73. {
  74. $backupFile = DB_NAME . ".Mysql";
  75. $command = "mysqldump --opt -h " . DB_HOST . " -u " . DB_USER . " -p" . DB_PASS . " " . DB_NAME . " > " . $_dir . "/" . $backupFile;
  76. try {
  77. system($command);
  78. return $backupFile;
  79. } catch (Exception $ex) {
  80. return FALSE;
  81. }
  82. }
  83. /**
  84. * Restaure une base de données MySQL à partir d'un fichier de dump.
  85. *
  86. * @param string $_backupFile Le chemin du fichier de dump à restaurer.
  87. * @return bool TRUE si la restauration a réussi, FALSE en cas d'erreur.
  88. */
  89. public static function dumpMysqlRestore(string $_backupFile)
  90. {
  91. $importCommand = "mysql -h " . escapeshellarg(DB_HOST) . " -u " . escapeshellarg(DB_USER) . " -p" . escapeshellarg(DB_PASS) . " " . DB_NAME . " < " . escapeshellarg($_backupFile);
  92. system($importCommand, $importResult);
  93. if ($importResult !== 0) {
  94. alert::recError("Erreur : Échec lors de l'importation des données.");
  95. return false;
  96. }
  97. return true;
  98. }
  99. /**
  100. * Scanne le dossier des sauvegardes pour récupérer les fichiers disponibles.
  101. *
  102. * @return array Un tableau contenant les informations des fichiers de sauvegarde.
  103. */
  104. public static function scanFolder()
  105. {
  106. $tempArray = array();
  107. if ($scandir = scandir(DIR_BACKUP)) {
  108. foreach ($scandir as $file) {
  109. $tempFile = NULL;
  110. if (is_file(DIR_BACKUP . $file) === TRUE and $file != "index.html") {
  111. $tempFile["file"] = $file;
  112. $tempFile["size"] = core::formatFileSize(filesize(DIR_BACKUP . $file), 2);
  113. $tempFile["date"] = core::dateFromTimestamp(filemtime(DIR_BACKUP . $file));
  114. $tempFile["timestamp"] = filemtime(DIR_BACKUP . $file);
  115. $tempArray[] = $tempFile;
  116. }
  117. }
  118. }
  119. return $tempArray;
  120. }
  121. /**
  122. * Récupère le dernier fichier de sauvegarde disponible.
  123. *
  124. * @return string Le nom du dernier fichier de sauvegarde.
  125. */
  126. public static function last()
  127. {
  128. $return = [];
  129. foreach (self::scanFolder() as $key => $value) {
  130. $return[$value["timestamp"]] = $value;
  131. }
  132. krsort($return);
  133. return array_values($return)[0]["file"];
  134. }
  135. /**
  136. * Supprime un fichier de sauvegarde.
  137. *
  138. * @param string $_nameBackup Le nom du fichier de sauvegarde à supprimer.
  139. * @return bool TRUE si la suppression a réussi, FALSE en cas d'erreur.
  140. */
  141. public static function delete(string $_nameBackup)
  142. {
  143. if(file_exists("/" . DIR_BACKUP . "/" . $_nameBackup)){
  144. unlink("/" . DIR_BACKUP . "/" . $_nameBackup);
  145. alert::recSuccess("BackUp :. Suppression de " . $_nameBackup);
  146. return TRUE;
  147. } else {
  148. alert::recError("BackUp :. Erreur lors de la suppression de " . $_nameBackup);
  149. return FALSE;
  150. }
  151. }
  152. }