Developer Snippet Diary

Database backup generate with cronjob or cmd using PHP

<?php 
// Path: config.php
// this file contains all the configuration for the backup script
# /usr/bin/php /home/xddd/mysite.com/backup.php //add cronjob like this

$host = "localhost";  // host name
$user = "";      // username
$password = "";     // password
$database = ""; // database name
$backupFolder =  'backups/'; // backup folder name
$hasOneDriveFolder = true; // if you have a onedrive folder to save the backup file
$fileName = $database .'-' . date('Y-m-d').'-'. time() . '.sql';

// Path: log_error.php
// Compare this snippet from backup.php:

if(!function_exists('log_error')){
    function log_error($error){
        $log_file = 'error_log.txt';
        $log = fopen($log_file, 'a');
        fwrite($log, date('Y-m-d H:i:s') . ' ' . $error . PHP_EOL);
        fclose($log);
    }
}


// create dd function
if(!function_exists('dd')){
    function dd(... $data){
        // if console connection
        if(php_sapi_name() == 'cli'){
            foreach($data as $d){

                print_r(PHP_EOL);
                // add color green to output
                print_r("\033[0;32m");
                print_r($d);
                print_r("\033[0m");
                print_r(PHP_EOL);
            }

            print_r(PHP_EOL);
            die();
        }

        
        echo '<pre>';
        foreach($data as $d){
            print_r(PHP_EOL);
            print_r($d);
            print_r(PHP_EOL);
            
        }
        echo '</pre>';
        die();
    }
}



try{
    
    // create DB connection 
    $dir = dirname(__FILE__) . $backupFolder . $fileName;
  
    $conn = new mysqli($host, $user, $password, $database);

    // Check connection
    if ($conn->connect_error) {
        // add error to log
        
        log_error("Connection failed: " . $conn->connect_error);
        die("Connection failed: " . $conn->connect_error);
    }

    // create dump of DB
    exec("mysqldump --user={$user} --password={$password} --host={$host} {$database} --result-file={$dir} 2>&1", $output);

    // create backup file from dump
    // add backup file to zip archive
    $zip = new ZipArchive();
    $zip_name = dirname(__FILE__) .$backupFolder.'/backup-' .$fileName . '.zip';
    if($zip->open($zip_name, ZipArchive::CREATE) !== TRUE){
        log_error("cannot open <$zip_name>");
        exit("cannot open <$zip_name>");
    }

    $zip->addFile($dir, $fileName);
    $zip->close();
    
    unlink(dirname(__FILE__) . $backupFolder .$fileName); //delete sql file only need zip file

    // remove old backups (older than 7 days)
    $files = glob(dirname(__FILE__) . $backupFolder . '*'); // get all file names
    foreach($files as $file){ // iterate files
        if(is_file($file) && time() - filemtime($file) >= 60*60*24*7) // if file is older than 7 days 60*60*24*7
            unlink($file); // delete file
    }

/*    if($hasOneDriveFolder){

        // add backup file to one drive (using onedrive local folder)
        $onedrive = dirname(__FILE__) . '/onedrive/';
        $backup = dirname(__FILE__) . '/backup-' .$fileName . '.zip';
        copy($backup, $onedrive . $fileName . '.zip');
        
        // remove backup file from server
        unlink($backup);


        // remove old backups from one drive (older than 7 days)
        $files = glob(dirname(__FILE__) . '/onedrive/*'); // get all file names
        foreach($files as $file){ // iterate files
            // dd($files, $file, time() - filemtime($file));
            if(is_file($file) && time() - filemtime($file) >= 60*60*24*7) // if file is older than 7 days
                unlink($file); // delete file
        }
    }*/

  
    // success message
    echo 'Backup created successfully';
    echo PHP_EOL;
    exit(1);
}catch(Exception $e){
    log_error($e->getMessage());
    die($e->getMessage());
}
Posted by: R GONDAL
Email: rizikmw@gmail.com