Php скрипт для ротации бэкапов

27.03.2022

Пример того, как можно сделать ротацию резервных копий на bash (sh) и php.

Для начала скрипт который будет делать zip файлов и mysql dump базы:

 

InPath=/var/www/SITE.ru/
OutPath=/backup/`date +%Y-%m-%d`/

mkdir $OutPath
#rm -rf $OutPath/*

zip -r $OutPath/files $InPath

mysqldump -uUSER -hlocalhost -p'PASSWORD' DB_NAME > $OutPath/DB_NAME .sql

php backup_rotator.php

- этот sh скрипт ставим на Cron.

И сам backup_rotator.php, он удаляет устаревшие копии:

 
<?php

function delTree($dir) {
    $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
        (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
} 

function dir_size($dir) {
   $totalsize=0;
   if ($dirstream = @opendir($dir)) {
      while (false !== ($filename = readdir($dirstream))) {
         if ($filename!="." && $filename!=".."){
            if (is_file($dir."/".$filename)) $totalsize+=filesize($dir."/".$filename);
            if (is_dir($dir."/".$filename)) $totalsize+=dir_size($dir."/".$filename);
         }
      }
   }
   closedir($dirstream);
   return $totalsize;
}

function get_dir_list($dir) {
    $aRet = [];
    if ($dirstream = @opendir($dir)) {
        while (false !== ($filename = readdir($dirstream))) {
            if ($filename!="." && $filename!=".."){
                $sTMP = $dir.$filename;
                    if (is_dir($sTMP)) $aRet[] = $sTMP;
            }
        }
    }
    closedir($dirstream);
    
    sort($aRet);
    
    return $aRet;
}

$sWorkPath = '/backup/';
$sToday = date('Y-m-d');

// Проверяем, что последний бэкап прошел (архив больше гигабайта).
$iSize = dir_size($sWorkPath.$sToday);

//$iSize = number_format($iSize / 1073741824, 2); // GB
//$iSize = number_format($iSize / 1024, 0);  // MB

if ($iSize > 1073741824){
    $aDirList = get_dir_list($sWorkPath);

    // Проверяем, что бэкап не единственный
    if(count($aDirList) > 1) {
        // Удалеям самый первый бэкап
//        echo $aDirList[0] ."\n";
        delTree($aDirList[0]);
    }
} else {
    // Отправляем сообщение об ошибке
    mail('EMAIL', 'Backup Error', 'Backup Error');
}


Категории: PHP, Linux, Script / Tool
Яндекс.Метрика