Tuesday, March 20, 2012

Simple backup script - using PHP and rsync

- Backup multiple directories and files
- Backup every X hours (run backup.php periodically using a scheduler; ex: cron)
- Store backup data separately for each date (backup history by date; ex: YYYY-MM-DD folders)
- Copy data in multiple (unlimited) backup destinations folders

// Backup options
$bkp_verbose = false;
$bkp_write_log_file = true;

// Directories / Files to back-up
$dir_bkp = array();
$dir_bkp[] = '/path-to-project1';
$dir_bkp[] = '/path-to-project2';
$dir_bkp[] = '/path-to-project3/file1';

// Backup storage directories
$dir_bkp_storage = array();
$date_bkp = date('Y-m-d');
$dir_bkp_storage[] = '/path-to-backup-dir1/' . $date_bkp;
$dir_bkp_storage[] = '/path-to-backup-dir2/' . $date_bkp;


foreach($dir_bkp_storage as $dir_storage) {
   
    $time_start = microtime(true);
   
    if(!is_dir($dir_storage)) {
        if(!mkdir($dir_storage, 0755)) {
            echo 'Error: could not create bkp dir: ' . $dir_storage;
            continue;
        }
    }

    foreach($dir_bkp as $dir) {
        echo chr(10) . 'copy backup from ' . $dir . ' to ' . $dir_storage . ' ... ';
        $cmd = "rsync -avz $dir $dir_storage/";
        if($bkp_verbose) {
            echo shell_exec($cmd);
        } else {
            shell_exec($cmd);
        }
    }
   
    if($bkp_write_log_file) {
        $time = microtime(true) - $time_start;
        file_put_contents(
            $dir_storage . '/bkp-log',
            'Date end: '.date('Y-m-d H:i:s') . chr(10) .
                'Total time: ' . $time . ' seconds' . chr(10)
        ');
    }
}

No comments: