Advertisement
Guest User

createBackup.php

a guest
Dec 22nd, 2014
831
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.72 KB | None | 0 0
  1. <?php
  2.  
  3. class Backup {
  4.    
  5.     private $source_dirs = array();
  6.     private $offset_dirs = false; // Служебная переменная, служащая для устранения лишних папок в архиве
  7.     private $dump_dir = false; // Директория, куда будут помещаться архивы
  8.     private $delay_delete = false; // Время в секундах, через которое архивы будут удаляться
  9.     private $filezip = false; // Имя архива
  10.     private $allfiles = array(); // Массив со списком всех файлов, которые будут помещены в архив
  11.     private $zip = false;
  12.     private $exclude = array(); // Массив с именами файлов или папок, которые не нужно включать в архив
  13.        
  14.     /* Параметры подключения к базе данных */
  15.     private $db_names = array(); // Массив с именами баз данных (имя базы данных можно посмотреть в phpMyAdmin)
  16.     private $host = "localhost"; // Хост MySQL
  17.     private $user = "root"; // Имя пользователя БД
  18.     private $password = ""; // Пароль пользователя БД
  19.     private $db_files = array(); // Массив, куда будут помещаться файлы с дампом баз данных
  20.  
  21.    
  22.     public function __construct() {
  23.         /* Пишем в массив имен названия БД, которые нужно забэкапить. У меня одна :) */
  24.         $this->db_names[] = "database_test";
  25.         $this->zip = new ZipArchive(); // Создаём объект класса ZipArchive
  26.         /* Пишем в массив имен названия каталогов, которые нужно забэкапить. У меня один, корневой каталог сайта :) */
  27.         $this->source_dirs[] = $_SERVER['DOCUMENT_ROOT'];
  28.         $this->offset_dirs = strlen(dirname($_SERVER['DOCUMENT_ROOT'])."/"); // Служебная переменная, служащая для устранения лишних папок в архиве
  29.         $this->dump_dir = $_SERVER['DOCUMENT_ROOT']."/backup"; // Директория, куда будут помещаться архивы
  30.         $this->delay_delete = 35 * 24 * 3600; // Время в секундах, через которое архивы будут удаляться
  31.         $this->filezip = "backup_".date("H-i-s-d-m-Y").".zip"; // Имя архива
  32.         $this->allfiles = array(); // Массив со списком всех файлов, которые будут помещены в архив
  33.         if(!file_exists($this->dump_dir)){
  34.             try{
  35.                 if(is_writable(dirname($this->dump_dir))){
  36.                     mkdir($this->dump_dir, 0777);
  37.                 }
  38.             }
  39.             catch(Exception $e){
  40.                 echo "Не удалось создать папку: ".$e->getMessage();
  41.             }
  42.         }
  43.     }
  44.  
  45.     public function createBackup($exclude = array()) {
  46.         $this->exclude = $exclude; // Массив с именами файлов или папок для исключения из архива
  47.         $this->deleteOldArchive(); // Удаляем все старые архивы
  48.         $this->createDataBaseBackup(); // Делаем дамп базы
  49.         if ($this->zip->open($this->dump_dir."/".$this->filezip, ZipArchive::CREATE) === true){
  50.             for ($i = 0; $i < count($this->source_dirs); $i++){
  51.                 /* Рекурсивный перебор всех директорий */
  52.                 if (is_dir($this->source_dirs[$i])){
  53.                     $this->recoursiveDir($this->source_dirs[$i]);
  54.                 }
  55.                 else{
  56.                     $this->allfiles[] = $this->source_dirs[$i]; // Добавляем файл в итоговый массив
  57.                 }
  58.                 foreach ($this->allfiles as $val){
  59.                     /* Добавляем в ZIP-архив все полученные файлы */
  60.                     $local = substr($val, $this->offset_dirs);
  61.                     $this->zip->addFile($val, $local);
  62.                 }
  63.             }
  64.             $this->zip->close();
  65.         }
  66.         foreach ($this->db_files as $file){
  67.             // Удаляем файлы дампа SQL. Они уже есть у нас в архиве - нахуй они нам больше не нужны ))
  68.             unlink($file);
  69.         }
  70.     }
  71.  
  72.     /* Метод для рекурсивного перебора и сохранения всех файлов и папок в массив, который затем возвращается */
  73.     private function recoursiveDir($dir){
  74.         if ($files = glob($dir."/{,.}*", GLOB_BRACE)) {
  75.             foreach($files as $file){
  76.                 $b_name = basename($file);
  77.                 if (($b_name == ".") || ($b_name == "..") || in_array($file, $this->exclude)){
  78.                     continue;
  79.                 }
  80.                 if (is_dir($file)){
  81.                     $this->recoursiveDir($file);
  82.                 }
  83.                 else{
  84.                     $this->allfiles[] = $file;
  85.                 }
  86.             }
  87.         }
  88.     }
  89.  
  90.     /* Метод для удаления всех старых архивов */
  91.     private function deleteOldArchive(){
  92.         $ts = time();
  93.         $files = glob($this->dump_dir."/*.zip");
  94.         foreach ($files as $file){
  95.             // Удаляем файлы старше установленного времени
  96.             if ($ts - filemtime($file) > $this->delay_delete){
  97.                 unlink($file);
  98.             }
  99.         }
  100.     }
  101.    
  102.     /* Метод для создания дампа всех БД на хосте */
  103.     private function createDataBaseBackup(){
  104.         for ($i = 0; $i < count($this->db_names); $i++) {
  105.             $filename = $this->db_names[$i].".sql"; // Имя файла с дампом базы данных
  106.             $this->db_files[] = $this->dump_dir."/".$filename; // Помещаем файл в массив
  107.             $fp = fopen($this->dump_dir."/".$filename, "a"); // Открываем файл
  108.             $db = new mysqli($this->host, $this->user, $this->password, $this->db_names[$i]); // Соединяемся с базой данных
  109.             $db->query("SET NAMES 'utf8'"); // Устанавливаем кодировку соединения
  110.             $result_set = $db->query("SHOW TABLES"); // Запрашиваем все таблицы из базы
  111.             while (($table = $result_set->fetch_assoc()) != false) {
  112.                 /* Перебор всех таблиц в базе данных */
  113.                 $table = array_values($table);
  114.                 if ($fp) {
  115.                     $result_set_table = $db->query("SHOW CREATE TABLE `".$table[0]."`"); // Получаем запрос на создание таблицы
  116.                     $query = $result_set_table->fetch_assoc();
  117.                     $query = array_values($query);
  118.                     fwrite($fp, "\r\n".$query[1].";\r\n"); // Добавляем результат в файл
  119.                     $rows = "SELECT * FROM `".$table[0]."`";
  120.                     $result_set_rows = $db->query($rows); // Получаем список всех записей в таблице
  121.                     while (($row = $result_set_rows->fetch_assoc()) != false) {
  122.                         $query = "";
  123.                         /* Путём перебора всех записей добавляем запросы на их создание в файл */
  124.                         foreach ($row as $field) {
  125.                             if (is_null($field)) $field = "NULL";
  126.                             else $field = "'".$db->real_escape_string($field)."'"; // Экранируем значения
  127.                             if ($query == "") $query = $field;
  128.                             else $query .= ", ".$field;
  129.                         }
  130.                         $query = "INSERT INTO `".$table[0]."` VALUES (".$query.");\r\n";
  131.                         fwrite($fp, $query);
  132.                     }
  133.                 }
  134.             }
  135.             fclose($fp); // Закрываем файл
  136.             $db->close(); // Закрываем соединение с базой данных и переходим к следующей
  137.         }
  138.     }
  139.  
  140. }
  141.  
  142. $backup = new Backup();
  143. // если раскомментировать следующие 2 строки и закомментировать третью, то файл .htaccess из корня сайта в архив не попадет
  144. //$excl = array(0=>$_SERVER['DOCUMENT_ROOT']."/.htaccess");
  145. //$backup->createBackup($excl);
  146. $backup->createBackup();
  147.  
  148. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement