2013年10月22日 星期二

[資料備份] 利用 PHP PharData 進打檔案打包並上傳至FTP

本來打算用簡單的 Shell Script 進行備份

且相關文章教學,也是很多....

But ....

出現了一個問題,在執行 ftp 連線,會停留在輸入帳、密階段

即使已經有設定帳、密還是一樣 ....

anyway ~

練習一下,用 PHP 撰寫備份程式吧!!





<?php
//  FTP 連線設定
define('FTP_HOST','ftp.host.tw') ;
define('FTP_USER','backup') ;
define('FTP_PWD','123456') ;

//  === 備份相關設定 ===
//  要備份的目錄
$backup_folder = array(
                       'Website.tar'=>'/var/www'
                      ,'Jerry.tar'=>'/home/jerry'
                      ,'Sam.tar'=>'/home/sam'
                      );
//  備份檔案 , 所有檔案會打包成 config.tar
$backup_file = array(
                     '/etc/xxx.php'
                    ,'/etc/yyy.conf'
                    );

//  備份壓縮檔存放位置 , 依日期為目錄 , ex : 20131022
define('BACKUP_TAR_DIR','/home/backup/' . date("Ymd", time()) . '/');
//  檢查備份目錄是否存在
if (!file_exists(BACKUP_TAR_DIR))
{
    if (!mkdir(BACKUP_TAR_DIR, 0755, true))
    {
        die('Failed to Create Backup Dir - ' . BACKUP_TAR_DIR);
    }
    write_log('mkdir : ' . BACKUP_TAR_DIR);
}

//  === 進行備份壓縮 ===
//  進行目錄打包
$uploadFiles = array();
foreach($backup_folder as $filename => $path)
{
    $tarFile = BACKUP_TAR_DIR . $filename ;
    if (!file_exists($path))
    {
        write_log('no folder : ' . $path);
        continue;
    }
    write_log('tar \'' . $tarFile . '\' From : ' . $path);
    try {
        $PD = new PharData($tarFile);
        $PD->buildFromDirectory($path);
    } catch (Exception $e) {
        // handle errors here
        die($e->getMessage());
    }
    $uploadFiles[] = $tarFile;
    write_log('finish tar file : ' . $tarFile);
}

//  進行檔案打包
$tarFile = BACKUP_TAR_DIR . 'config.tar' ;
$uploadFiles[] = $tarFile;
write_log('begin tar file : ' . $tarFile);
try {
    $PD = new PharData($tarFile);    
    foreach($backup_file as $file)
    {
        if (!file_exists($file))
        {
            write_log('no file : ' . $file);
            continue;
        }
        $PD->addFile($file);
        write_log('add file : ' . $file);
    }
} catch (Exception $e) {
    // handle errors here
    var_dump($e->getMessage());
}
write_log('finish tar file : ' . $tarFile);


// 連線,參數分別是 HOST, PORT, TIMEOUT
$conn = ftp_connect(FTP_HOST, 21, 60) or die("Connect FTP Server Fail"); 
ftp_login($conn, FTP_USER, FTP_PWD);
ftp_pasv($conn, true);  // 使用被動模式,這個指令必須在ftp_login 後立即使用

write_log('ftp connnecting....');

//  檔案上傳至FTP則不建目錄 , 以日期為檔案字首為命名 , ex : 20131022_xxx.tar
$dt_flag = date("Ymd_", time());
foreach ($uploadFiles as $file)
{
    if (!file_exists($file))
    {
        write_log('no file : ' . $file);
        continue;
    }
    //上傳一個檔案,注意傳送模式為 FTP_BINARY
    if (ftp_put($conn, $dt_flag . basename($file), $file, FTP_BINARY)) 
    {
        write_log('put file : ' . $file);
    } else {
        write_log('pub error : ' . $file);
    }
}

// ftp_delete($conn, "FILENAME");   // 刪除檔案

ftp_close($conn);   //關閉連結

write_log('Filish!!!!!!');

function write_log($str, $br=true)
{
    echo $str;
    if ($br)
    {
        echo "\n";
    }
}

?>

檢視 home/backup
應該會有一個目錄&底下有四個tar檔案

 /20131022
  - Website.tar
  - Jerry.tar
  - Sam.tar
  - config.tar

再檢視一下 ftp 的目錄
應該會有四個檔案

/
  - 20131022_Website.tar
  - 20131022_Jerry.tar
  - 20131022_Sam.tar
  - 20131022_config.tar


沒有留言:

張貼留言