返回列表 回复 发帖

[分享]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"),在执行此语句时,并不清空数据文件里面的数据,从而防止了数据丢失。

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表