| 
 
     
- UID
 - 1 
 - 威望
 - 1240 点 
 - 金钱
 - 24019 金币 
 - 点卡
 - 317 点 
 
  | 
1#
 
发表于 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"),在执行此语句时,并不清空数据文件里面的数据,从而防止了数据丢失。 |   
 
 
 
 
                     我是一个呼吸着现在的空气而生活在过去的人 
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠 
                                     我已习惯了孤独,爱上孤独 
                                 他让我看清了自我,还原了自我 
                             让我再静静的沉思中得到快乐和满足 
                                   再孤独的世界里我一遍又一遍 
                                   不厌其烦的改写着自己的过去 
                                             延伸到现在与未来 
                                       然而那只是泡沫般的美梦 
                                 产生的时刻又伴随着破灭的到来 
                         在灰飞烟灭的瞬间我看到的是过程的美丽 
                                      而不是结果的悲哀。。。 
 | 
 
 
 
 |