1

我正在使用以下代码:

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);
}

这很好用,但每隔 3-4 周就会经常说,命中计数器会突然从 1548 下降到 53(只是一个例子,不是字面数字)——有人知道为什么会发生这种情况吗?

错误日志显示:

PHP Warning:  fread() [<a href='function.fread'>function.fread</a>]: Length parameter must be greater than 0 in /my/home/dir/www.mysite.com/count.php on line 6
4

1 回答 1

1

长度参数必须大于0

嗯,是吗?

如果文件大小失败,则返回 false。False 被评估为 0。

如果此时无法读取文件,filesize 可能会失败。我认为如果您同时获得两个命中,则可能会发生这种情况。其中一个正在写入文件,而另一个尝试读取它。另一种可能是文件大小可以读取,但它是 0,因为另一个访问者打开了文件,但还没有写入新值。

因此,要解决这个问题,您应该对文件应用锁定,更好地处理和检查这些函数的结果代码,或者更好:将存储移动到数据库。

于 2011-12-19T09:49:08.723 回答