0

我正在使用以下基本 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个。有人知道为什么吗?

4

2 回答 2

1

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

于 2012-07-18T08:50:29.807 回答
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); 
?> 
于 2013-04-21T11:04:58.607 回答