關(guān)于網(wǎng)站文件自動(dòng)備份程序的一點(diǎn)思考
摘要:
本文提供了一種使用asp php腳本來(lái)實(shí)現(xiàn)網(wǎng)站文件備份的思路,可以實(shí)現(xiàn)指定文件的按天備份。
個(gè)人網(wǎng)站往往在虛擬主機(jī)上,對(duì)主機(jī)的控制權(quán)限很小,因此不能使用諸如任務(wù)計(jì)劃來(lái)實(shí)現(xiàn)定時(shí)備份,我們需要換一種思路來(lái)實(shí)現(xiàn)相似的自動(dòng)備份。
我們可以利用用戶對(duì)網(wǎng)站的訪問(wèn)來(lái)實(shí)現(xiàn)對(duì)指定文件的按天備份。
基本思路是:用戶訪問(wèn)網(wǎng)站 → 讀取最后備份日期、讀取當(dāng)前日期然后比較,如果這兩個(gè)日期不一致則調(diào)用備份程序來(lái)實(shí)現(xiàn)對(duì)指定文件的備份,備份完成后再寫(xiě)入新的日期標(biāo)記,這時(shí)候用戶再訪問(wèn)網(wǎng)站,日期已經(jīng)是最新的了,就會(huì)跳過(guò)備份程序繼而執(zhí)行其他程序。
分析這個(gè)思路:備份程序會(huì)在每天的第一個(gè)用戶訪問(wèn)網(wǎng)站的時(shí)候啟動(dòng),便可以達(dá)到按天備份的效果,然而如果這天沒(méi)有用戶訪問(wèn)則不會(huì)備份,這個(gè)并無(wú)多大關(guān)系,因?yàn)槿绻麤](méi)有用戶訪問(wèn)網(wǎng)站,則網(wǎng)站內(nèi)容不會(huì)發(fā)生很大改變。因此可以忽略這個(gè)情況。
需要注意的是,可能存在兩個(gè)人同時(shí)訪問(wèn)網(wǎng)站,而同時(shí)啟動(dòng)備份程序的情況,便可能會(huì)對(duì)備份內(nèi)容造成覆蓋,對(duì)此我們可以在程序中添加判斷語(yǔ)句,如果文件已經(jīng)存在則不去覆蓋它。
如果是要備份的兩個(gè)文件的文件名也相同則也會(huì)造成覆蓋,我們假定文件是全不相同的。
還有一個(gè)比較重要的問(wèn)題是,在備份程序中必須采用的時(shí)期格式是 4位數(shù)年和2位數(shù)月、日,不足位數(shù)必須補(bǔ)零。 例如:2006-05-31只有這樣才能實(shí)現(xiàn)日期大小的比較,在asp中我們可以用一個(gè)小程序來(lái)實(shí)現(xiàn),在php中已經(jīng)有這樣的日期格式了。
下面詳細(xì)說(shuō)明程序的構(gòu)造,以asp為例。
===bak_set.asp===
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"
Iso標(biāo)準(zhǔn)日期函數(shù):
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è)置讀取出到函數(shù)中的變量中,并且得到網(wǎng)站的服務(wù)器路徑
檢查備份主文件夾(例如:backup/)是否存在,當(dāng)前備份文件夾(例如:backup/2006-05-30/)是否存在,然后將需要備份的文件保存到當(dāng)前備份文件夾;
計(jì)算出備份文件的保存期,讀取以前的備份日期列表,然后兩者相比較,如果日期小于保存期則將備份文件刪除,如果不需要?jiǎng)h除則將日期轉(zhuǎn)存到新變量中。
生成新的備份設(shè)置并將之寫(xiě)入原設(shè)置文件。
具體程序如下:
' Function: 文件定時(shí)備份程序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 寫(xiě)
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
相關(guān)文章
ASP開(kāi)發(fā)中可能遇到的錯(cuò)誤信息中文說(shuō)明大全(整理收集)
ASP開(kāi)發(fā)中可能遇到的錯(cuò)誤信息中文說(shuō)明大全(整理收集)...2007-03-03asp頁(yè)面提示Response 對(duì)象 錯(cuò)誤 ASP 0156 : 80004005 HTTP 頭錯(cuò)誤
訪問(wèn)asp頁(yè)面時(shí)提示Response 對(duì)象 錯(cuò)誤 ASP 0156 : 80004005 HTTP 頭錯(cuò)誤?,行 0 已將 HTTP 頭輸出到客戶端瀏覽器。任何對(duì) HTTP 頭的修改都必須在輸出頁(yè)內(nèi)容之前進(jìn)行。2011-09-09asp下檢查表中是否存在某個(gè)字段(列)函數(shù)
asp可以方便的檢查數(shù)據(jù)庫(kù)表中,是否存在這個(gè)字段2008-03-03ASP中Session技巧 默認(rèn)過(guò)期時(shí)間為20分鐘
寫(xiě)過(guò)稍微大型一點(diǎn) ASP 的人都知道,Session 這個(gè)對(duì)象真是好用,它可以用來(lái)記錄使用者私有的資料變量,既安全又方便。但是你真的知道 Session 的運(yùn)作原理嗎?2012-08-08TSYS中生成靜態(tài)頁(yè)時(shí)溢出: ''CInt''
TSYS中生成靜態(tài)頁(yè)時(shí)溢出: ''CInt''...2007-01-01ASP下的簡(jiǎn)潔的多重查詢的方法與函數(shù) 真不錯(cuò)
ASP下的簡(jiǎn)潔的多重查詢的方法與函數(shù) 真不錯(cuò)...2007-10-10ASP中不用模板生成HTML靜態(tài)頁(yè)面的方法
我們一般生成HTML靜態(tài)頁(yè)時(shí),常常會(huì)事先做好一個(gè)模板,然后生成時(shí)調(diào)用模板文件。那么有沒(méi)有辦法不用模板,如一個(gè)正常的htmer.asp頁(yè)面,直接生成為htmer.html頁(yè)面呢?2010-06-06