關(guān)于網(wǎng)站文件自動備份程序的一點思考
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
摘要:
本文提供了一種使用asp php腳本來實現(xiàn)網(wǎng)站文件備份的思路,可以實現(xiàn)指定文件的按天備份。 個人網(wǎng)站往往在虛擬主機上,對主機的控制權(quán)限很小,因此不能使用諸如任務計劃來實現(xiàn)定時備份,我們需要換一種思路來實現(xiàn)相似的自動備份。 我們可以利用用戶對網(wǎng)站的訪問來實現(xiàn)對指定文件的按天備份。 基本思路是:用戶訪問網(wǎng)站 → 讀取最后備份日期、讀取當前日期然后比較,如果這兩個日期不一致則調(diào)用備份程序來實現(xiàn)對指定文件的備份,備份完成后再寫入新的日期標記,這時候用戶再訪問網(wǎng)站,日期已經(jīng)是最新的了,就會跳過備份程序繼而執(zhí)行其他程序。 分析這個思路:備份程序會在每天的第一個用戶訪問網(wǎng)站的時候啟動,便可以達到按天備份的效果,然而如果這天沒有用戶訪問則不會備份,這個并無多大關(guān)系,因為如果沒有用戶訪問網(wǎng)站,則網(wǎng)站內(nèi)容不會發(fā)生很大改變。因此可以忽略這個情況。 需要注意的是,可能存在兩個人同時訪問網(wǎng)站,而同時啟動備份程序的情況,便可能會對備份內(nèi)容造成覆蓋,對此我們可以在程序中添加判斷語句,如果文件已經(jīng)存在則不去覆蓋它。 如果是要備份的兩個文件的文件名也相同則也會造成覆蓋,我們假定文件是全不相同的。 還有一個比較重要的問題是,在備份程序中必須采用的時期格式是 4位數(shù)年和2位數(shù)月、日,不足位數(shù)必須補零。 例如:2006-05-31只有這樣才能實現(xiàn)日期大小的比較,在asp中我們可以用一個小程序來實現(xiàn),在php中已經(jīng)有這樣的日期格式了。 下面詳細說明程序的構(gòu)造,以asp為例。 ===bak_set.asp=== 復制代碼 代碼如下:Dim root_dir root_dir = "/" Dim bak_set Set bak_set = Server.createobject("Scripting.Dictionary") bak_set.Add "last_bak" , "2006-05-30" bak_set.Add "file_list" , "data.mdb|system.mdb" bak_set.Add "file_path" , "database/|database/" bak_set.Add "bak_dir" , "backup/" bak_set.Add "bak_date" , "2006-05-27|2006-05-28|2006-05-29|2006-05-30" bak_set.Add "perfix" , "@" bak_set.Add "date_out" , "2" 以上是備份設置文件,root_dir 是網(wǎng)站主目錄的路徑,是網(wǎng)站的一個全局設置,剩下的是備份設置,我們需要知道:要備份的文件名、路徑,備份在什么地方,備份保留幾天,備份文件的文件名前綴,兩個經(jīng)常變化的設置是最后備份日期和備份過的日期的列表。在全部的路徑設置中都需要用“/”結(jié)束 Iso標準日期函數(shù): 復制代碼 代碼如下:Function IsoDate(str_date) Dim temp If IsDate(str_date) Then temp = Year(str_date)&"-"& Right("0"&Month(str_date),2) & "-"& Right("0" & Day(str_date),2) Else temp = str_date End If IsoDate=temp End Function 備份函數(shù)的思路: 先將備份設置讀取出到函數(shù)中的變量中,并且得到網(wǎng)站的服務器路徑 檢查備份主文件夾(例如:backup/)是否存在,當前備份文件夾(例如:backup/2006-05-30/)是否存在,然后將需要備份的文件保存到當前備份文件夾; 計算出備份文件的保存期,讀取以前的備份日期列表,然后兩者相比較,如果日期小于保存期則將備份文件刪除,如果不需要刪除則將日期轉(zhuǎn)存到新變量中。 生成新的備份設置并將之寫入原設置文件。 具體程序如下: 復制代碼 代碼如下:'================================== ' Function: 文件定時備份程序backup files ' Need var: root_dir , bak_set , isodate() ' Need file bak_set.asp ' return : true / false '================================== Function bak_start() '1 Dim perfix perfix = bak_set("perfix") Dim files files = split(bak_set("file_list"),"|") Dim paths paths = split(bak_set("file_path"),"|") Dim now_date now_date = isodate(date) 'response.Write(now_date) Dim sev_root sev_root = Server.MapPath(root_dir) Dim bak_root bak_root = sev_root & "\" & bak_set("bak_dir") Dim bak_dir bak_dir = bak_root & "\" & now_date & "\" '2 create backup Dim fso Set fso = Server.createobject("Scripting.FileSystemObject") If Not fso.FolderExists(bak_root) Then fso.CreateFolder(bak_root) If Not fso.FolderExists(bak_dir) Then fso.CreateFolder(bak_dir) 'response.Write(bak_dir) If Ubound(files) > Ubound(paths) Then bak_start = false Exit Function End If Dim i 'On Error Resume Next For i = 0 To Ubound(files) 'response.Write(sev_root & "\" & paths(i) & files(i)) If fso.FileExists( sev_root & "\" & paths(i) & files(i) ) And Not fso.FileExists(bak_dir & perfix & files(i)) Then fso.CopyFile sev_root & "\" & paths(i) & files(i) , bak_dir & perfix & files(i) End If Next '3 Delete out of date backup Dim date_out date_out = isodate( date - Abs(bak_set("date_out")) ) 'response.Write(date_out) Dim dates Dim bak_date bak_date = "" dates = split(bak_set("bak_date"),"|") For i = 0 To Ubound(dates) If dates(i) < date_out Then 'On Error Resume Next If fso.FolderExists(bak_root & "\" & dates(i)) Then fso.DeleteFolder bak_root & "\" & dates(i) Else bak_date = bak_date & dates(i) & "|" End If Next bak_date = bak_date & now_date bak_set("bak_date") = bak_date '4 update settings Dim f Set f = fso.OpenTextFile(Server.MapPath("bak_set.asp"),2,true)'2 寫 Dim temp ,keys temp = "<%" &vbCrlf & _ "Dim root_dir"&vbCrlf & _ "root_dir = """& root_dir &"""" &vbCrlf & _ "Dim bak_set" &vbCrlf & _ "Set bak_set = Server.createobject(""Scripting.Dictionary"")"&vbCrlf keys = bak_set.Keys For i = 0 to Ubound(keys) temp = temp & "bak_set.Add """&keys(i)&""" , """ & bak_set(keys(i)) & """" & vbCrlf Next temp = temp & "%" & ">" f.write temp f.Close Set fso = Nothing Set f = Nothing bak_start = true End Function 最后,也是最重要的,那就是安全問題,如果備份的文件能被瀏覽器打開,那后果可能是很嚴重的!所以應當謹慎選取備份文件夾,如果服務器允許訪問網(wǎng)站的外部目錄,那么應當把備份的路徑也指定到網(wǎng)站外部,例如:網(wǎng)站根目錄解析到了 XXX/htdoc/ 而你對此也有讀寫權(quán)限 xxx/ 那么就可以將備份文件加指定到 xxx/backup/ 這樣就比較安全。如果沒有這樣的權(quán)限,那么就必須保證,需要備份的文件本身就是安全的。 該文章在 2010/12/9 9:16:27 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |