2012-07-18 73 views
0

我用的是以下基本PHP:PHP计数器在文件锁定后仍然失去命中?

<?php 

    if (file_exists('count_file.txt')) 
    { 
     $fil = fopen('count_file.txt', r); 
     $dat = fread($fil, filesize('count_file.txt')); 
     echo $dat+1; 
     fclose($fil); 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, $dat+1); 
    } 

    else 
    { 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, 1); 
     echo '1'; 
     fclose($fil); 
    } 
?> 

的命中计数器(我宁愿没有之一,但它一直在坚持我们这样做)。 txt文件保持点击的计数,它的工作原理...但随机(有时在几个星期,有时几个月后)决定绊倒并从4300下降到11.

我被告知定为这是使用文件锁定,所以我改成下面的代码:

<?php 

     $dat = file_get_contents('count_file.txt'); 
     $fil = fopen('count_file.txt', 'w'); 
     if (flock($fil, LOCK_EX)) { 
      echo $dat+1; 
      fwrite($fil, $dat+1); 
      flock($fil, LOCK_UN); 
     } 
     fclose($fil); 

    ?> 

现在,几天后它再次从5000到13任何下降有一些想法,为什么?

+0

为什么不来存储计数数据库?如果需要在外部文件中,然后运行一些脚本来获得点击次数? – dpitkevics 2012-07-18 08:49:04

+0

我不是PHP精明的,所以不知道如何去存储它在数据库中? – John 2012-07-18 08:55:06

回答

1

你fopen()写文件截断文件。如果无法获得锁,则关闭可能被截断的文件,然后关闭到零字节。

+0

如果他没有得到应该通常意味着它被锁定的锁。他怎么能截断它为零呢? – worenga 2012-07-18 08:54:47

+0

我认为这至少可以发生在进程A(持有锁)写入文件并且进程B在文件被解锁并由A关闭之前打开用于写入的文件。 – mdo 2012-07-18 09:05:27

0

使用的fopen “A” 代替的fopen “W”,然后截断该文件:

<?php 
    $dat = file_get_contents('count_file.txt'); 
    $fil = fopen('count_file.txt', 'a'); 
    if (flock($fil, LOCK_EX)) { 
     ftruncate($fil,0); 
     echo $dat+1; 
     fwrite($fil, $dat+1); 
     flock($fil, LOCK_UN); 
    } 
    fclose($fil); 
?>