Re: [问题] 读取XML 导致档案被清空???

楼主: CindyLinz (Cindy Wang)   2013-03-30 02:00:25
看起来 $gXMLLOCK 只是要用来当 file lock 的凭借,
然后这程式利用 file lock 来作程式万一同时执行时的 mutex lock 用.
没打算在这个档案里面存东西..
然后.. 在 XMLwrite 里面 open 那个 $filename 的时候,
档案就会清空了,
也许是 XMLout($ref) 出来的东西是空的,
所以印到档案里面也是空的?
想确认这点的话,
可以在这边写档的前后再另开一个档案也把 $result 写进去,
档名中可以其中一段是当时的时间戳记,
这样档案就不会一直盖住了.
不过如果 XMLout 发生 exception 的话,
那这样就不会执行到你加的写档程式,
你可以帮它包一层 eval { } 把这个 exception 吸收掉..
另外 XMLread 里面 $XMLEVERCORRUPTED 那边有点怪,
当它被设为 1 的时候, 一定就马上 return 了,
所以下面那行检查 $XMLEVERCORRUPTED 决定要不要 return
应该永远都不会成立..
※ 引述《kuangs (kuangs)》之铭言:
: 小弟目前在修改网站后端程式 采用XML档来存资料
: 目前发现一个问题 不定时
: (有时候一天一次 有时候两次 有时候一个礼拜都不会发生)
: 会造成我的XML档案被清空
: 找了很多可能性 后来怀疑 "有可能" 是Perl 在 读/写 XML时 造成的问题
: 但是却找不到证据 或是 BUG点
: 想请问 各位是否有人也碰到类似问题 ???
: 或是 有什么方法可以厘清问题 谢谢
: 下面撷取部分程式码(这两段程式码 不是我自己写的)
: sub XMLwrite
: {
: my ($ref, $filename)=@_;
: my $availramdsk=getAvailRamDiskSize();
: if ( $availramdsk < 100 ){return;}
: if ( !open(XMLLOCK, "> $gXMLLOCK") ){return;}
: flock(XMLLOCK, 2);
: if ( !open(XMLFILE, "> $filename") ){return;}
: my $result=XMLout($ref);
: print XMLFILE $result;
: close XMLFILE;
: flock(XMLLOCK, 8);
: close XMLLOCK;
: }
: sub XMLread
: {
: my ($filename)=@_;
: my $XMLEVERCORRUPTED=0;
: if ( !(-e $filename) || (-z $filename) ){$XMLEVERCORRUPTED = 1;return;}
: if ( $XMLEVERCORRUPTED ){return;}
: if ( !open(XMLLOCK, "< $gXMLLOCK") ){return;}
: flock(XMLLOCK, 2);
: my $ref=XMLin($filename, forcearray=>1);
: flock(XMLLOCK, 8);
: close XMLLOCK;
: return $ref;
: }
: $gXMLLOCK 这个变量指向一个空的档案
: 可是我不知道这档案是要做什么的.........

Links booklink

Contact Us: admin [ a t ] ucptt.com