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灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP