Php计数器永远不会失败

时间:2015-02-01 17:39:52

标签: php counter

我设法使这个PHP计数器没有数据库,它是非常基本的,因为它增加.txt文件中的访问:

$counter_file = ("count.txt");
$fp = fopen($counter_file, "r");
$count = fread($fp, 1024);
fclose($fp);
$count = $count +1;
$fp = fopen($counter_file, "w");
fwrite($fp, $count);
fclose($fp);

但是当访问太快时,此计数器在远程服务器上失败。它回到0。 什么可以解释这种行为以及如何确保计数器永远不会回到0?

修改:此脚本更稳健。它使用flock作为@ghopst建议。

$counter_file = ("count.txt");
$handle = fopen($counter_file,"r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize($counter_file));
    $count = $count + 1;
    ftruncate($handle, 0);
    rewind($handle);
    fwrite($handle, $count);
    flock($handle, LOCK_UN);
} else {
    echo "Could not Lock File!";
}
fclose($handle);

2 个答案:

答案 0 :(得分:1)

它归结为文件系统,您的代码向每个访问者发出打开,读取,关闭,打开,写入和关闭文件的请求。如果正在写入文件,则它被锁定而不被另一个实例写入,这是文件系统的行为。也许最好有一个带有autoincrement列的简单数据库表,只需为每次访问插入一行然后删除它,然后你可以选择顶行来返回一个值。

答案 1 :(得分:-1)

试试这个版本:

<?php

    $counter_file = ("count.txt");
    $count = @file_get_contents($counter_file);
    $count = $count ? intval($count) + 1 : 1;
    file_put_contents($counter_file, $count);