首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP计数器在文件锁定后仍然丢失命中?

PHP计数器在文件锁定后仍然丢失命中?
EN

Stack Overflow用户
提问于 2012-07-18 16:45:16
回答 2查看 383关注 0票数 0

我使用的是以下基本PHP:

代码语言:javascript
复制
<?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文件记录命中次数,它随机地works...however计数器(有时是几周后,有时是几个月后),决定出错并从4300下降到11。

我被告知解决这个问题的方法是使用文件锁定,所以我改成了下面的代码:

代码语言:javascript
复制
<?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。有人知道为什么吗?

EN

回答 2

Stack Overflow用户

发布于 2012-07-18 16:50:30

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-21 19:04:59

使用fopen "a“代替fopen "w”,然后截断文件:

代码语言:javascript
复制
<?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); 
?> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11537508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档