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