А ты забэкапился? Пишем скрипт для резервного копирования сайта

А ты забэкапился? Пишем скрипт для резервного копирования сайта

01.04.2013

Нередко перед вебмастерами становится задача резервного копирования сайта. Но далеко не все системы управления имеют инструменты для выполнения данной операции.

Когда передо мной стала такая задача и не оказалось под рукой доступных инструментов в голову пришла мысль самому написать скрипт для бэкапа не только базы данных, но и всех файлов сайта.

В принципе операция резервного копирования файлов и базы данных элементарно осуществляется в ручную, как это делается читайте в блоге KtoNaNovenkogo.ru.

Приступим к написанию скрипта. Во первых определимся с функциями:

  1. Скрипт должен создавать файл с бэкапом базы данных.
  2. Скрипт должен выполнять бэкап файлов и папок, помещая все в один zip-архив.
  3. Должна быть возможность сохранения резервной копии в папке и отправка по email.

Часть 1. Backup базы данных.

Делая резервную копию базы данных мы должны осознавать то, что нам может понадобиться не только содержимое таблиц — данные, но и сама структура. Тут нам поможет SQL-запрос:

SHOW CREATE TABLE `tablename`;

Кроме того всегда необходимо помнить про кодировку в которой хранятся данные в таблиах, ибо мы рискум получить иероглифы. С этой проблемой нам поможет справиться запрос.

SET NAMES charset

Естественно charset — используемая кодировка. Пример: "SET NAMES latin1".

Итак, мы будем работать с базой данный, соответственно должны задать параметры подключения к БД:

$host = "localhost"; // имя сервера
$user = "root"; // имя пользователя
$password = ""; // пароль
$db_name = "site"; // имя базы данных

Дальше необходимо задать настройки самого скрипта:

$dump_dir = "/backup/"; // директория, куда будем сохранять резервный копии БД и файлов
$dump_mail = "adminmail@site.ru"; // электронка, на которую будет отправлен backup-файл
$filename = $db_name.".sql"; //файл дампа БД
$source_dir = "/"; //директория, резервную копию которой будем сохранять
$filezip = "arhiv.zip"; //архив бэкапа всех файлов и директорий

Подключаемся к базе данных:

$link = mysql_connect($host, $user, $password) or die( "Сервер базы данных не доступен" );//подключаемся к серверу БД
$db = mysql_select_db($db_name) or die( "База данных не доступна" ); //выбираем базу данных

Основной код дампера:

mysql_query("SET NAMES utf8") or die( "Ошибка при выполнении запроса: ".mysql_error() );
$tables = "SHOW TABLES";
$res = mysql_query($tables) or die( "Ошибка при выполнении запроса: ".mysql_error() );
$fp = fopen( $dump_dir."/".$filename, "a" );
$dbc = "CREATE DATABASE IF NOT EXISTS `".$db_name."`";
fwrite ($fp, $dbc[1].";
 USE ".$dbc[0].";
");
while( $table = mysql_fetch_row($res) )
{
     if ( $fp )
     {
         $query = mysql_fetch_row(mysql_query("SHOW CREATE TABLE `".$table[0]."`"));
         fwrite ($fp, $query[1].";
 
");
         $rows = 'SELECT * FROM `'.$table[0].'`';
         $r = mysql_query($rows) or die("Ошибка при выполнении запроса: ".mysql_error());
         while( $row = mysql_fetch_row($r) )
         {
             $query = "";
             foreach ( $row as $field )
             {
                 if ( is_null($field) )
                     $field = "NULL";
                 else
                     $field = "'".mysql_escape_string( $field )."'";
                 if ( $query == "" )
                     $query = $field;
                 else
                     $query = $query.', '.$field;
             }
             $query = "REPLACE INTO `".$table[0]."` VALUES (".$query.");
 
";
             fwrite ($fp, $query);
         }
     }
}
         fclose ($fp);

Теперь разберемся что тут происходит:

$tables = "SHOW TABLES"; // запрос на получение списка таблиц базы данных
$res = mysql_query($tables); //выполняем запрос

Открываем файл для записи:

$fp = fopen( $dump_dir."/".$filename, "a" );

Дальше в цикле перебираем таблицы. В результате выполнения запроса:

"SHOW CREATE TABLE `".$table[0]."`"

получаем SQL-запрос создания таблицы и

fwrite ($fp, $query[1].";
");

записываем его в файл. Далее получаем данные из таблицы и в файл записываем запрос на обновления данных в таблице.

$rows = 'SELECT * FROM `'.$table[0].'`';
$query = "REPLACE INTO `".$table[0]."` VALUES (".$query.");
 
";
fwrite ($fp, $query);

Запись закончена, закрываем файл :

fclose ($fp);

Собственно дамп базы данных готов теперь нам нужно упаковать файлы в архив. Я использовал код работы с zip-архивами из статьи "Работа с zip архивами php, создание архиватора на php".

Часть 2. Создание бэкапа файлов и директорий.

Для начала в файле php.ini необходимо раскомментировать строку extension=php_zip.dll, или убедиться что данное расширение включено у вас на хостинге, так как без него функции будут недоступны.

Привожу код архиватора, модифицированный под наши цели:

// Создаем архив и добавляем в него все файлы из директории
$zip = new ZipArchive;
if ($zip->open($dump_dir."/".$filezip, ZipArchive::CREATE) === true){
        $allfiles   =   array();
                recoursiveDir($source_dir);
        foreach ($allfiles as $key=>$val){
            $zip->addFile($val);
        }
        $zip->close();
}
 
function recoursiveDir($dir){
    global $allfiles;
    if ($files = glob($dir.'/*')){
        foreach($files as $file){
            if (is_dir($file)){
                recoursiveDir($file);
            }else{
                $allfiles[]    =   $file;
            }
        }
    }
}

Вот собственно и все, наш скрипт для создания резервной копии сайта готов. Теперь можно улучшить его добавив функцию отправки по e-mail. Готовое решение можете посмотреть в статье Михаила Русакова Отправка файла по e-mail на PHP.

Как организовать на php отправку e-mail с несколькими вложениями читайте тут.


Узнал сам - поделись с друзьями!

Возврат к списку