Достаточно популярная (и крайне необходимая) задача сохранить папку с сервера на резервом 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();
}
Данный скрипт легко переделать под бэкап любой папки на сервере.