This Script Assumes a folder with daily backups exists. It incrementally deletes backups. It is configurable from command line switches and comes with a default schedule already setup.
<?php $backup_dir = "/home/demo/backup"; $keep_files_days = 14; $extension_to_delete = "tgz"; $size_to_delete = 0; $test = false; $progressive = true; $log = true; $date = date("YmdHis"); $log_file = "delete_old_backups_$date.log"; $log_path = "/var/log/backup_scripts/"; $log_string = "---------------------------------------------------------\n" . "Starting Delete_old_backups script\nDate $date\n\n\n"; /** * @var Integer number of days to keep daily backups */ $daily = 7; $weekly = 4; $monthly = 12; //check for command line argument foreach ($argv as $arg) { $item = explode("=", $arg); switch ($item[0]) { case "dir": $backup_dir = $item[1]; break; case "keep": $keep_files_days = $item[1]; break; case "extension": $extension_to_delete = $item[1]; break; case "size": $size_to_delete = $item[1]; break; case "progressive": $progressive = $item[1]; break; case "daily": $daily = $item[1]; break; case "weekly": $weekly = $item[1]; break; case "monthly": $monthly = $item[1]; break; case "log": $log = $item[1]; break; case "log_file": $log_file = $item[1]; break; case "log_path": $log_path = $item[1]; break; case "help": echo get_help(); break; case "test": $test = ($item[1] === "true"); break; } } /** * Setting up timestamps to compare daily, weekly, monthly */ $daily_days = $daily; $weekly_days = $weekly * 7; $monthly_days = $monthly * 30; $daily_file_string = date("YmdHis", strtotime("-$daily_days day")) . ".tgz"; $weekly_file_string = date("YmdHis", strtotime("-$weekly_days day")) . ".tgz"; $monthly_file_string = date("YmdHis", strtotime("-$monthly_days day")) . ".tgz"; $first_month = true; $first_week = true; $weekly_position = $weekly - 1; $monthly_position = $monthly - 1; $weekly_array = array(); for ($i = ($weekly - 1); $i >= 0; $i--) { $week_start_date = ($i * 7); $week_end_date = ($i * 7) - 7; $weekly_array[$i] = array( "keep" => false, "start_filename" => date("YmdHis", strtotime("-$week_start_date day")) . ".tgz", "end_filename" => date("YmdHis", strtotime("-$week_end_date day")) . ".tgz", ); } $monthly_array = array(); for ($i = ($monthly - 1); $i >= 0; $i--) { $month_start_date = ($i * 30); $month_end_date = ($i * 30) - 30; $monthly_array[$i] = array( "keep" => false, "start_filename" => date("YmdHis", strtotime("-$month_start_date day")) . ".tgz", "end_filename" => date("YmdHis", strtotime("-$month_end_date day")) . ".tgz", ); } /** * Listing files in directory */ $timestamp_to_keep = strtotime("-$keep_files_days day"); $files = scandir($backup_dir); $date_to_keep = date("Ymd", $timestamp_to_keep); foreach ($files as $file) { $log_string .= "found file $file\n"; $to_delete = false; $file_path = $backup_dir . "/" . $file; if (endsWith($file, ".$extension_to_delete")) { if ($progressive) { $daily_cmp = strcmp($file, $daily_file_string); /** * Backups are taken daily so we do nothing for the files less than the daily threshold */ if ($daily_cmp < 0) { $weekly_cmp = strcmp($file, $weekly_file_string); /** * Checking for weekly files */ if ($weekly_cmp >= 0) { if (can_delete($weekly_array, $weekly_position, $file, $first_week)) { $to_delete = true; } } else { if (can_delete($monthly_array, $monthly_position, $file, $first_month)) { $to_delete = true; } }//end monthly (else greater than 4 weeks ago) } }//end if $progressive = true else { // echo "ends with $extension_to_delete\n"; $timestamp_cmp = strcmp($file, $date_to_keep); //echo $timestamp_cmp . "\n"; if (($timestamp_cmp < 0) && ($progressive == false )) { $to_delete = true; if ($debug){ echo "to_delete $file\n"; } //echo $file_path . "\n"; }//end check for time and progressive == false; }//end else (progressive == false) if ($to_delete) { $log_string .= "Deleting $file\n"; if (!$test) { unlink($file_path); } }//end if($to_delete) else { $log_string .= "Keeping $file\n"; }//end else (!$to_delete) }//end check for timestamp }//end foreach file //var_dump($test); $ret = file_put_contents($log_path . $log_file, $log_string, FILE_APPEND); //var_dump($ret); exit(); /* * ********************************************************************************** */ function can_delete(&$periods, &$period_pointer, $current_file, &$first_period) { if (in_period($periods, $period_pointer, $current_file, $first_period)) { if ($periods[$period_pointer]["keep"] == false) { $periods[$period_pointer]["keep"] = $current_file; return false; } else { return true; } } return true; } function in_period(&$periods, &$period_pointer, $current_file, &$first_period) { $start_cmp = strcmp($periods["$period_pointer"]["start_filename"], $current_file); $end_cmp = strcmp($periods["$period_pointer"]["end_filename"], $current_file); while (($end_cmp < 0) && ($period_pointer >= 0)) {// && ($first_period === true)) { $period_pointer--; $start_cmp = strcmp($periods["$period_pointer"]["start_filename"], $current_file); $end_cmp = strcmp($periods["$period_pointer"]["end_filename"], $current_file); } $first_period = false; if (($start_cmp < 0) && ($end_cmp >= 0)) { return true; } return false; } function endsWith($haystack, $needle) { $length = strlen($needle); if ($length == 0) { return true; } return (substr($haystack, -$length) === $needle); } function get_help() { return <<<help Script to delete old backups. Options: help -- show this message dir={dir} -- Change the location of the backups case "progressive": case "daily": case "weekly": case "monthly": case "log": case "log_file": case "log_path": help; }
Top site ,.. amazaing post ! Just keep the work on !
Hm,.. amazing post ,.. just keep the good work on!
Top ,.. I will save your website !
I do not even know how I ended up here, but I thought this post was good. I don’t know who you are but definitely you are going to a famous blogger if you are not already 😉 Cheers!