Вход Регистрация
* Balltazor

Автоматическое резервное копирование

  1. <?php
  2. set_time_limit(0); // Убираем ограничение на максимальное время работы скрипта
  3. /* Массив с именами баз данных (имя базы данных можно посмотреть в phpMyAdmin) */
  4. $db_names = array();
  5. $db_names[] = "db1";
  6. $db_names[] = "db2";
  7.  
  8. /* Массив с именами директорий, в которых лежат все файлы сайта */
  9. /* ВАЖНО: Все пути должны быть физическими и идти от корня сервера. Точный физический путь можно посмотреть через phpinfo() */
  10. $source_dirs = array();
  11. $source_dirs[] = "/home/mysite1.ru";
  12. $source_dirs[] = "/home/mysite2.ru";
  13.  
  14. $offset_dirs = strlen("/home/"); // Служебная переменная, служащая для устранения лишних папок в архиве
  15.  
  16. /* Параметры подключения к базе данных */
  17. $host = "localhost";
  18. $user = "root";
  19. $password = "";
  20.  
  21. $dump_dir = "/home/backup"; // Директория, куда будут помещаться архивы
  22. $delay_delete = 35 * 24 * 3600; // Время в секундах, через которое архивы будут удаляться
  23. $filezip = "backup_".date("Y-m-d").".zip"; // Имя архива
  24.  
  25. deleteOldArchive(); // Удаляем все старые архивы
  26.  
  27. if (file_exists($dump_dir."/".$filezip)) exit; // Если архив с таким именем уже есть, то заканчиваем скрипт
  28.  
  29. $db_files = array(); // Массив, куда будут помещаться файлы с дампом баз данных
  30.  
  31. for ($i = 0; $i < count($db_names); $i++) {
  32. $filename = $db_names[$i].".sql"; // Имя файла с дампом базы данных
  33. $db_files[] = $dump_dir."/".$filename; // Помещаем файл в массив
  34. $fp = fopen($dump_dir."/".$filename, "a"); // Открываем файл
  35. $db = new mysqli($host, $user, $password, $db_names[$i]); // Соединяемся с базой данных
  36. $db->query("SET NAMES 'utf-8'"); // Устанавливаем кодировку соединения
  37. $result_set = $db->query("SHOW TABLES"); // Запрашиваем все таблицы из базы
  38. while (($table = $result_set->fetch_assoc()) != false) {
  39. /* Перебор всех таблиц в базе данных */
  40. $table = array_values($table);
  41. if ($fp) {
  42. $result_set_table = $db->query("SHOW CREATE TABLE `".$table[0]."`"); // Получаем запрос на создание таблицы
  43. $query = $result_set_table->fetch_assoc();
  44. $query = array_values($query);
  45. fwrite($fp, "n".$query[1].";n"); // Добавляем результат в файл
  46. $rows = "SELECT * FROM `".$table[0]."`";
  47. $result_set_rows = $db->query($rows); // Получаем список всех записей в таблице
  48. while (($row = $result_set_rows->fetch_assoc()) != false) {
  49. $query = "";
  50. /* Путём перебора всех записей добавляем запросы на их создание в файл */
  51. foreach ($row as $field) {
  52. if (is_null($field)) $field = "NULL";
  53. else $field = "'".$db->real_escape_string($field)."'"; // Экранируем значения
  54. if ($query == "") $query = $field;
  55. else $query .= ", ".$field;
  56. }
  57. $query = "INSERT INTO `".$table[0]."` VALUES (".$query.");";
  58. fwrite($fp, $query);
  59. }
  60. }
  61. }
  62. fclose($fp); // Закрываем файл
  63. $db->close(); // Закрываем соединение с базой данных и переходим к следующей
  64. }
  65.  
  66. $zip = new ZipArchive(); // Создаём объект класса ZipArchive
  67. $allfiles = array(); // Массив со списком всех файлов, которые будут помещены в архив
  68. if ($zip->open($dump_dir."/".$filezip, ZipArchive::CREATE) === true) {
  69. for ($i = 0; $i < count($source_dirs); $i++) {
  70. /* Рекурсивный перебор всех директорий */
  71. if (is_dir($source_dirs[$i])) recoursiveDir($source_dirs[$i]);
  72. else $allfiles[] = $source_dirs[$i]; // Добавляем файл в итоговый массив
  73. foreach ($allfiles as $val){
  74. /* Добавляем в ZIP-архив все полученные файлы */
  75. $local = substr($val, $offset_dirs);
  76. $zip->addFile($val, $local);
  77. }
  78. }
  79. /* Добавляем в ZIP-архив все дампы баз данных */
  80. for ($i = 0; $i < count($db_files); $i++) {
  81. $local = substr($db_files[$i], strlen($dump_dir) + 1);
  82. $zip->addFile($db_files[$i], $local);
  83. }
  84. $zip->close();
  85. }
  86.  
  87. for ($i = 0; $i < count($db_files); $i++) unlink($db_files[$i]); // Очищаем массив db_files
  88.  
  89. /* Функция для рекурсивного перебора и сохранения всех файлов и папок в массив, который затем возвращается */
  90. function recoursiveDir($dir){
  91. global $allfiles;
  92. if ($files = glob($dir."/{,.}*", GLOB_BRACE)) {
  93. foreach($files as $file){
  94. $b_name = basename($file);
  95. if (($b_name == ".") || ($b_name == "..")) continue;
  96. if (is_dir($file)) recoursiveDir($file);
  97. else $allfiles[] = $file;
  98. }
  99. }
  100. }
  101.  
  102. /* Функция для удаления всех старых архивов */
  103. function deleteOldArchive() {
  104. global $dump_dir;
  105. global $delay_delete;
  106. $ts = time();
  107. $files = glob($dump_dir."/*.zip");
  108. foreach ($files as $file)
  109. if ($ts - filemtime($file) > $delay_delete) unlink($file);
  110. }
  111. ?>
» Описание: Дальше, всё, что Вам нужно - это поставить его в cron, например, раз в сутки в 2 часа ночи. Тогда ес
» Время добавления: 8 Мая 2014 в 00:37
» Посмотров: 1319
» textarea
» Рейтинг: [+0 | -0]
Комментарии [0]
Онлайн: 2
Реклама