Простой бэкап сайта средствами PHP

В этой статье я попытаюсь разъяснить создание простого скрипта для полного бэкапа сайта (файлы + база данных MySQL) средствами PHP, который будет отправлять отчет на почту и удалять старые архивы.

Для начала нужен FTP доступ к файловой системе, где расположен сайт. Предположим, что сайт у нас находится по адресу /home/my_site/www. Создаем папку backup в my_site:

mkdir /home/my_site/backup

И конечно же, сам файл backup.php:

touch /home/my_site/www/backup.php

Открываем backup.php любым редактором и создаем переменные:

$backup_folder = '/home/my_site/backup';    // куда будут сохранятся файлы
$backup_name = 'my_site_backup_' . date("Y-m-d");    // имя архива
$dir = '/home/my_site/www';    // что бэкапим
$delay_delete = 30 * 24 * 3600;    // время жизни архива (в секундах)

$db_host = 'example.com';
$db_user = 'root';
$db_password = 'password';
$db_name = 'database';

$mail_to = 'my_email@example.com';
$mail_subject = 'Site backup';
$mail_message = '';
$mail_headers = 'MIME-Version: 1.0' . "\r\n";
$mail_headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$mail_headers .= 'To: me <my_email@example.com>' . "\r\n";
$mail_headers .= 'From: my_site <info@example.com>' . "\r\n";

Пишем функцию для бэкапа файлов:

function backupFiles($backup_folder, $backup_name, $dir)
{
    $fullFileName = $backup_folder . '/' . $backup_name . '.tar.gz';
    shell_exec("tar -cvf " . $fullFileName . " " . $dir . "/* ");
    return $fullFileName;
}

База данных:

function backupDB($backup_folder, $backup_name)
{
    $fullFileName = $backup_folder . '/' . $backup_name . '.sql';
    $command = 'mysqldump -h' . $db_host . ' -u' . $db_user . ' -p' . $db_password . ' ' . $db_name . ' > ' . $fullFileName;
    shell_exec($command);
    return $fullFileName;
}

И для удаления старых архивов:

function deleteOldArchives($backup_folder, $delay_delete)
{
    $this_time = time();
    $files = glob($backup_folder . "/*.tar.gz*");
    $deleted = array();
    foreach ($files as $file) {
        if ($this_time - filemtime($file) > $delay_delete) {
            array_push($deleted, $file);
            unlink($file);
        }
    }
    return $deleted;
}

В общем все, осталось выполнить данные функции и отправить письмо:

$start = microtime(true);    // запускаем таймер

$deleteOld = deleteOldArchives($backup_folder, $delay_delete);    // удаляем старые архивы
$doBackupFiles = backupFiles($backup_folder, $backup_name, $dir);    // делаем бэкап файлов
$doBackupDB = backupDB($backup_folder, $backup_name);    // и базы данных

// добавляем в письмо отчеты
if ($doBackupFiles) {
    $mail_message .= 'site backuped successfully<br/>';
    $mail_message .= 'Files: ' . $doBackupFiles . '<br/>';
}

if ($doBackupDB) {
    $mail_message .= 'DB: ' . $doBackupDB . '<br/>';
}

if ($deleteOld) {
    foreach ($deleteOld as $val) {
        $mail_message .= 'File deleted: ' . $val . '<br/>';
    }
}

$time = microtime(true) - $start;     // считаем время, потраченое на выполнение скрипта
$mail_message .= 'script time: ' . $time . '<br/>';

mail($mail_to, $mail_subject, $mail_message, $mail_headers);    // и отправляем письмо

На этом все. Надеюсь статья будет для кого-то полезной.
Tags:
php, бэкап, резервное копирование, сайты, mysql

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.