Board logo

标题: [分享]CGI程序运行时数据丢失的改进 [打印本页]

作者: cnangel    时间: 2003-12-9 12:21     标题: [分享]CGI程序运行时数据丢失的改进

  在用PERL写的CGI程序在运行当中,常常会发生数据文件丢失的问题,如本站的浏览计数程序就曾经发生过多次数据丢失的情况。这是什么原因呢?据我分析,数据丢失是发生在多个用户对数据文件进行操作时。在程序中对数据文件中的数据更新的程序通常如下:
open(re,"tj.txt");#设此时tj.txt文件里面的数据为100
$a=<re>;
close(re);
$a++;
open(WR,">tj.txt");#注意此时tj.txt数据文件已经被清空
print WR "$a";
close(WR);
    执行上面的程序后,数据文件tj.txt里面的数据应该为101。如两个人在一定的时间差内执行以上程序,当第一个人执行完open(WR,">tj.txt");这一语句(注意此时tj.txt数据文件已经被清空),这个时候第二个人刚好跟着执行这一语句,有于数据文件里面的数据是空的,那么变量a的值为零,当后者执行完整个进程后,显而易见,数据文件里面的数据为1。综观整个进程,造成数据丢失的关键语句是open(WR,">tj.txt");。
    针对以上问题,有两种改进方法:
1、给数据文件加锁,即当某一进程打开数据文件后,马上对这一数据文件加锁,防止了其他进程使用它。在完成了对数据文件的操作后,才对数据文件解锁,释放给其他进程使用。加锁语句:flock(WR,1),只要将此语句放到open(WR,">tj.txt")的下面即可,当进程执行完close(WR)语句后,将自动解锁。此语句只能在UNIX和WINDOWS NT系统下使用。
2、将open(WR,">tj.txt")语句改成open(WR,"+〈tj.txt"),在执行此语句时,并不清空数据文件里面的数据,从而防止了数据丢失。




欢迎光临 星星博客 (http://commerce.huhoo.net/) Powered by Discuz! 7.0.0