Perl 板


LINE

我的網站有一個很久以前寫的下載管理程式,平時運作還正常 但是就是有一點很奇怪,隔一段時間,下載的資料檔會突然變成empty 也就是0位元組,裡面什麼都沒有 我想是因為下載人數會去更動到檔案的部份,如果有兩個人同時下載檔案 可能會造成檔案損壞之類的情況,但這只是個人推測 而奇怪的是我看我原始檔裡面有lock檔阿,可是不知為何 隔一段時間資料檔就會突然清空 以下是該Perl程式的檔案,新增人數的函數是addtime 誰可不可以幫我看一下,是我鎖檔案沒弄好所造成的錯誤,還是什麼樣的情況 會造成檔案內容清空? #!/usr/bin/perl ## ~--------------------- ## ~ 取得資料 ## ~--------------------- sub getdata{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $in, $ENV{'CONTENT_LENGTH'}); }else{ $in = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$in); foreach $pair(@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #解碼 $value =~ s/\,/&#44;/g; #取代,號 $value =~ s/\r\n/<br>/g; #取代斷行 if ($FORM{$name} ne ''){ $FORM{$name} = "$FORM{$name},$value"; #給予FORM }else{ $FORM{$name} = $value; } } } ## ~--------------------- ## ~ 係統設定 ## ~--------------------- $perl_url = 'download.pl'; ## 程式位置 $data_url = 'download/data.cgi'; ## 資料庫位置 $sn_url = 'download/sn.txt'; ## 流水號檔 $id = '********'; ## 管理帳號 $pass = '*******'; ## 管理密碼 $s_url{'out'} = 'download_out.htm' ; ## 外部樣版 $s_url{'table'} = 'download/table.htm' ; ## 表格樣版 $s_url{'adm_m'} = 'download/adm_menu.htm' ; ## 管理員選單樣版 $s_url{'adm_t'} = 'download/adm_table.htm' ; ## 管理員表格樣版 $s_url{'login'} = 'download/login.htm' ; ## 管理員登入樣版 $s_key{'in'} = '!~in~!'; ## 外部樣版置入 $s_key{'name'} = '!~name~!'; ## 名稱 $s_key{'text'} = '!~text~!'; ## 簡介 $s_key{'d_url'} = '!~d_url~!'; ## 載點 $s_key{'c_time'} = '!~c_time~!'; ## 次數 $s_key{'size'} = '!~size~!'; ## 大小 $s_key{'pic'} = '!~pic~!'; ## 圖片位置 $s_key{'url'} = '!~url~!'; ## 程式位置 $s_key{'sn'} = '!~sn~!'; ## 檔案編號 ## ~--------------------- ## ~ 主要程式 ## ~--------------------- &getdata; ## 取得資料 &getcookie; ## 取得Cookie &setadmcookie; ## 設定ADMCookie &loadskins; ## 載入樣版 if ($FORM{mode} eq 'new' && &c_idps == 1){ &newfile; print "Location: $perl_url\n\n"; ## 跳回原頁 exit; }elsif($FORM{mode} eq 'download'){ &addtime($FORM{sn}); print "Location: $FORM{url}\n\n"; ## 跳到檔案 exit; }elsif($FORM{mode} eq 'login'){ print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭 $skin_get{login}=~ s/$s_key{url}/$perl_url/g; $skin_get{out} =~ s/$s_key{in}/$skin_get{login}/g; print "$skin_get{out}"; exit; }elsif($FORM{'mode'} eq 'out' && &c_idps == 1){ $date_gmt = "1987, 1\-1\-1 1:1:1 GMT"; print "Set-Cookie:id=0; expires=$date_gmt\n"; print "Set-Cookie:pass=0; expires=$date_gmt\n"; print "Location: $perl_url\n\n"; ## 跳回原頁 exit; }elsif($FORM{mode} eq 'fix' && &c_idps == 1){ &fixfile($FORM{sn}); print "Location: $perl_url\n\n"; ## 跳回原頁 exit; }elsif($FORM{mode} eq 'top' && &c_idps == 1){ &topfile($FORM{sn}); print "Location: $perl_url\n\n"; ## 跳回原頁 exit; }elsif($FORM{mode} eq 'del' && &c_idps == 1){ &delfile($FORM{sn}); print "Location: $perl_url\n\n"; ## 跳回原頁 exit; }elsif(&c_idps == 1){ &shelladmhtml; print "Location: $perl_url\n\n"; ## 跳回原頁 exit; } &shellhtml; exit; ## ~--------------------- ## ~ 輸出網頁 ## ~--------------------- sub shellhtml{ print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭 if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");} @gd=<GD>; close(GD); foreach $gad(@gd){ ($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})= split(/,/,$gad) ; chomp($GD{'sn'}); $gethtml = $skin_get{table}; foreach $keyi(keys %s_key){ $gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g; } $htmlshell .= $gethtml; } if ($htmlshell eq ''){ $htmlshell='<br><div align="center"></div><table width="500" border="0" align="left"><tr><td><div align="center">沒有檔案 </div></td></tr></table><br>'; } $htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管 理作品下載</a></div>"; $skin_get{out} =~ s/$s_key{in}/$htmlshell/g; print "$skin_get{out}"; } ## ~--------------------- ## ~ 輸出管理員用網頁 ## ~--------------------- sub shelladmhtml{ print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭 if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");} @gd=<GD>; close(GD); $GD{'url'} =$perl_url; $htmlshell = $skin_get{'adm_m'}; $htmlshell =~ s/$s_key{url}/$perl_url/g; foreach $gad(@gd){ ($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})= split(/,/,$gad) ; chomp($GD{'sn'}); $gethtml = $skin_get{adm_t}; foreach $keyi(keys %s_key){ $gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g; } $htmlshell .= $gethtml; } if ($htmlshell eq ''){ $htmlshell='<br><div align="center"></div><table width="500" border="0" align="left"><tr><td><div align="center">沒有檔案 </div></td></tr></table><br>'; } $htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管 理作品下載</a></div>"; $skin_get{out} =~ s/$s_key{in}/$htmlshell/g; print "$skin_get{out}"; } ## ~--------------------- ## ~ 新增下載資料 ## ~--------------------- sub newfile{ if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");} @gd=<GD>; close(GD); &getsn; $name = $FORM{'name'}; $text = $FORM{'text'}; $d_url = $FORM{'d_url'}; $pic = $FORM{'pic'}; $size = $FORM{'size'}; $wd = "$name,$text,$d_url,$pic,$size,0,$sn\n"; unshift(@gd,$wd); ## 對檔尾的斷行去除 $last=pop(@gd); #取出 chomp($last); push(@gd,$last); #放回 ## 存回記錄檔 if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");} flock(2,SD); #鎖檔 print SD @gd; flock(8,SD); #開鎖 close(SD); &addsn; } ## ~--------------------- ## ~ 刪除檔案 ## ~--------------------- sub delfile{ ## 取得記錄檔 if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");} @gd=<GD>; close(GD); $delsn=$_[0]; foreach $gad(@gd){ ($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ; chomp($sn); if ($delsn == $sn){ $gad=''; } } ## 存回記錄檔 if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");} flock(2,SD); #鎖檔 print SD @gd; flock(8,SD); #開鎖 close(SD); } ## ~--------------------- ## ~ 檔案置頂 ## ~--------------------- sub topfile{ ## 取得記錄檔 if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");} @gd=<GD>; close(GD); $topsn=$_[0]; foreach $gad(@gd){ ($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ; chomp($sn); if ($topsn == $sn){ splice(@gd,$i,1); unshift(@gd,"$name,$text,$d_url,$pic,$size,$c_time,$sn\n"); } $i++; } ## 對檔尾的斷行去除 $last=pop(@gd); #取出 chomp($last); push(@gd,$last); #放回 ## 存回記錄檔 if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");} flock(2,SD); #鎖檔 print SD @gd; flock(8,SD); #開鎖 close(SD); } ## ~--------------------- ## ~ 增加次數 ## ~--------------------- sub addtime{ ## 取得記錄檔 if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");} @gd=<GD>; close(GD); $addsn=$_[0]; foreach $gad(@gd){ ($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ; chomp($sn); if ($addsn == $sn){ $c_time++; $gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n"; } } ## 對檔尾的斷行去除 $last=pop(@gd); #取出 chomp($last); push(@gd,$last); #放回 ## 存回記錄檔 if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");} flock(2,SD); #鎖檔 print SD @gd; flock(8,SD); #開鎖 close(SD); } ## ~--------------------- ## ~ 修改檔案 ## ~--------------------- sub fixfile{ ## 取得記錄檔 if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");} @gd=<GD>; close(GD); $fixsn=$_[0]; $name = $FORM{'name'}; $text = $FORM{'text'}; $d_url = $FORM{'d_url'}; $pic = $FORM{'pic'}; $size = $FORM{'size'}; $c_time= $FORM{'c_time'}; foreach $gad(@gd){ ($temp,$temp,$temp,$temp,$temp,$temp,$sn)= split(/,/,$gad) ; chomp($sn); if ($fixsn == $sn){ $gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n"; } } ## 對檔尾的斷行去除 $last=pop(@gd); #取出 chomp($last); push(@gd,$last); #放回 ## 存回記錄檔 if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");} flock(2,SD); #鎖檔 print SD @gd; flock(8,SD); #開鎖 close(SD); } ## ~--------------------- ## ~ 設定ADM的Cookie ## ~--------------------- sub setadmcookie{ if ($FORM{id} ne '' && $FORM{pass} ne ''){ print "Set-Cookie:id=$FORM{id};\n"; print "Set-Cookie:pass=$FORM{pass};\n"; $COOKIE{id}=$FORM{id}; $COOKIE{pass}=$FORM{pass}; } } ## ~--------------------- ## ~ 得到Cookie ## ~--------------------- sub getcookie{ $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); ##取得不同組的cookie foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $COOKIE{$name} = $value; } if ($FORM{'pass'} ne ''){ $COOKIE{'pass'}=$FORM{'pass'};} if ($FORM{'id'} ne ''){ $COOKIE{'id'}=$FORM{'id'};} } ## ~--------------------- ## ~ 得到頁數資料 ## ~--------------------- sub get_page{ $FORM{page}-=1; if ($book_m <= $page_ch){ ## 篇數沒有超過指定的換頁數 $book_s=0; $book_e=$book_m-1; }else{ if ($book_m % $page_ch==0){ $page_m=$book_m / $page_ch; }else{ $page_m=int($book_m / $page_ch)+1; } if ($FORM{page}+1>=$page_m){ ## 最後一頁 或超過 $FORM{page}=$page_m-1; $book_s=$FORM{page} * $page_ch; $book_e=$book_m -1 ; }else{ if ($FORM{page} < 0){ $FORM{page}=0; } $book_s=$FORM{page} * $page_ch; $book_e=(($FORM{page}+1) * $page_ch)-1; } } if ($page_m eq ''){ $page_m=0; } } ## ~--------------------- ## ~ 載入所有樣版 ## ~--------------------- sub loadskins{ foreach $skinkey(keys %s_url) { &loadskin($s_url{$skinkey},$skinkey) } } ## ~--------------------- ## ~ 載入樣版 ## ~--------------------- sub loadskin{ if ( !( open(SKIN,"<$_[0]") ) ){&error("$_[0] 樣版 無法讀取");} @gskin=<SKIN>; close(SKIN); foreach $line(@gskin){ $skin_get{$_[1]}="$skin_get{$_[1]}$line"; } } ## ~--------------------- ## ~ 得到流水號 ## ~--------------------- sub getsn{ if ( !( open(SN,"<$sn_url") ) ){&error("$sn_url無法讀取");} $sn=<SN>; close(SN); ## 流水號檔內容為空 設為0 if ($sn eq '') { $sn=0; } } ## ~--------------------- ## ~ 遞增流水號 ## ~--------------------- sub addsn{ $sn++; if ( !( open(SN,">$sn_url") ) ){&error("$sn_url無法存檔");} print SN $sn; close(SN); } ## ~--------------------- ## ~ 發生錯誤 ## ~--------------------- sub error{ print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭 print "發生錯誤 : $_[0]" ; exit; } ## ~--------------------- ## ~ 確認帳號密碼 ## ~--------------------- sub c_idps{ if(($FORM{id} eq $id && $FORM{pass} eq $pass) || ($COOKIE{id} eq $id && $COOKIE{pass} eq $pass)){ return 1; }else{ return 0; } } -- VICTOR工作室 | PTT遊戲設計版隆重開幕! | 不管是新手老手,程式美工音樂企劃.... URL : http://www.kinmen.info/vic/ | 都歡迎來遊戲設計版參與討論 XD | 戰略高手> C/C++ | GameTopics> Visual Basic 6.0 | GameDesign --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.134.242.171







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP