Простой бэкап папки по FTP на PHP

Достаточно популярная (и крайне необходимая) задача сохранить папку с сервера на резервом FTP. Ранее мы уже рассматривали вариант как это сделать на Shell с архивированием папки, а теперь попробуем закачать папку целиком и уже на PHP.

Предыдущую статью можно посмотреть по ссылке.

С помощью скрипта я собираюсь делать бэкап папки monitor(хранит записи разговоров) сервера asterisk. При активных телефонных переговорах в офисе данная папка быстро вырастает в размерах и если место на сервере заканчивается телефония начинает работать некорректно. На сервере будут оставляться только переговоры за последние 3 месяца + текущий. Для этого мы будем запускать скрипт по cron первого числа каждого месяца ночью и он будет перемещать на FTP папку с текущим месяцем минус 4.

0 5 1 * *    /usr/bin/php /home/user/monitor_backup.php 
#1 числа каждый месяц в 5 утра

!Не забываем указывать в crontab полный путь к исполняемому php файлу. Узнать его можно командой:

# whereis php
php: /usr/bin/php /etc/php.d /etc/php.ini /usr/lib/php /usr/include/php /usr/share/php /usr/share/man/man1/php.1.gz

Так же у скрипта есть возможность удаления перенесенных файлов. Так как asterisk сервера часто установлены на старом оборудовании и ПО, то скрипт максимально простой. Например, на моем asterisk сервере установлен PHP 5.1.

<?php
/*
 * PHP ver 5.1 support
 * */

$MONTH_AGO=4;
$remove_uploaded = false;

$server="ftp_server_ip";
$port=21;
$username="ftp_user";
$password="user_pass";

$upload_dir="/Backup/Monitor/";
$monitor_dir="/var/spool/asterisk/monitor/";

writeLn("Backup started: ".date('d.m.Y H:i'));

$year = (date('Y', strtotime("-$MONTH_AGO month")));
$month = (date('m', strtotime("-$MONTH_AGO month")));

//$errors_upload = 0;
//$success_upload = 0;

writeLn("Folder to upload: $year/$month");

// Установка соединения
if (!$conn = ftp_connect($server, $port)){
    writeLn('Connetcion filed', true);
}

if ($login_result = ftp_login($conn, $username, $password)) {
    ftp_pasv($conn, true);

    if (!ftp_chdir($conn, $upload_dir)){
        writeLn("Base upload dir not found", true);
    }
    if(!ftp_chdir($conn, "test")){
        if (ftp_mkdir($conn, 'test'))
            writeLn("Year dir created");
        else
            writeLn("Error on created year dir", true);
        ftp_chdir($conn, "test");
    }

    if (!ftp_chdir($conn, $upload_dir."test")){
        writeLn("Upload year dir not found and not created", true);
    }

    ftp_upload_dir($conn, $monitor_dir.$year."/".$month, $upload_dir.$year."/".$month, $remove_uploaded);

    writeLn("");
    writeLn("Backup finished: ".date('d.m.Y H:i'));
//    writeLn("Uploaded files: $success_upload");
//    writeLn("Error files: $errors_upload");
} else {
    writeLn("Login filed");
}
// Закрытие соединения
ftp_close($conn);


// Закачать папку с файлами
function ftp_upload_dir($conn_id, $src, $drc, $remove = false) {
    @ftp_mkdir($conn_id, $drc);

    $objs = scandir($src);
    foreach($objs as $obj) {
        if ($obj == '.' || $obj == '..') {
            continue;
        } elseif (is_dir($src . '/' . $obj)) {
            ftp_upload_dir($conn_id, $src . '/' . $obj, $drc . '/' . $obj, $remove);
        } else {
            @ftp_chdir($conn_id, $drc . '/' . $obj);
            $filename = $src . '/' . $obj;
            if (ftp_put($conn_id, $drc . '/' . $obj, $filename, FTP_BINARY)){ //files will be rewrite
                writeLn("Upload file: $filename");
//              $success_upload++;
                if ($remove){
if (unlink($filename)) //удаляем локальный файл перенесенный на ftp
                        writeLn("File removed");
                    else
                        writeLn("Error while remove file!");
                }
            } else {
                writeLn("Error while upload file: $filename");
//              $errors_upload++;
            }
        }
    }
}

function writeLn($text, $exit = false) {
    echo $text."\r\n";
    if ($exit)
        exit();
}

Данный скрипт легко переделать под бэкап любой папки на сервере.

Запись опубликована в рубрике PHP, Администрирование, Без рубрики, Телефония с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *