文件锁定后,PHP计数器仍会丢失命中?

时间:2012-07-18 08:45:16

标签: php counter

我使用的是以下基本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.任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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); 
?>